Я хочу определить эффективную целочисленную функцию пола, то есть преобразование из числа с плавающей запятой или двойного, которое выполняет усечение до минус бесконечности.
Можно предположить, что значения таковы, что целочисленное переполнение не происходит. Пока у меня есть несколько вариантов
-
приведение к int; это требует специальной обработки отрицательных значений, поскольку приведение усекается до нуля;
I= int(F); if (I < 0 && I != F) I--;
-
приведение результата пола к int;
int(floor(F));
-
приведение к int с большим сдвигом для получения положительных результатов (это может вернуть неправильные результаты для больших значений);
int(F + double(0x7fffffff)) - 0x7fffffff;
Преобразование в int заведомо медленное. Так и есть, если тесты. Я не приурочил функцию пола, но видел сообщения, утверждающие, что это также медленно.
Можете ли вы придумать лучшие альтернативы с точки зрения скорости, точности или допустимого диапазона? Это не должно быть портативным. Цели - последние архитектуры x86/x64.