Итак, вы хотите действительно быстрое преобразование с плавающей точкой -> int? AFAIK int-> float конвертируется быстро, но, по крайней мере, в MSVC ++ преобразование float-> int вызывает небольшую вспомогательную функцию ftol (), которая делает некоторые сложные вещи для обеспечения выполнения преобразования, соответствующего стандартам. Если вам не нужно такое строгое преобразование, вы можете взломать сборку, предполагая, что вы используете x86-совместимый процессор.
Вот функция для быстрого преобразования с плавающей точкой в int, которая округляется с использованием синтаксиса встроенной сборки MSVC ++ (в любом случае она должна дать вам правильное представление):
inline int ftoi_fast(float f)
{
int i;
__asm
{
fld f
fistp i
}
return i;
}
В MSVC ++ 64-bit вам понадобится внешний файл .asm, поскольку 64-битный компилятор отклоняет встроенную сборку. Эта функция в основном использует необработанные инструкции x87 FPU для load float (fld), а затем сохраняет float как целое число (fistp). (Примечание: вы можете изменить режим округления, используемый здесь, напрямую настраивая регистры на процессоре, но не делайте этого, вы сломаете много вещей, включая реализацию MSVC sin и cos!)
Если вы можете предполагать поддержку SSE на процессоре (или есть простой способ сделать кодировку, поддерживающую SSE), вы также можете попробовать:
#include <emmintrin.h>
inline int ftoi_sse1(float f)
{
return _mm_cvtt_ss2si(_mm_load_ss(&f)); // SSE1 instructions for float->int
}
... что в основном то же самое (загрузка с плавающей точкой, затем сохранение в виде целого числа), но с использованием инструкций SSE, которые немного быстрее.
Один из них должен охватывать дорогостоящий случай с плавающей точкой на int, и любые преобразования int-to-float по-прежнему должны быть дешевыми. Извините за специфичность для Microsoft, но именно здесь я проделал аналогичную работу по повышению производительности и таким образом получил большие выгоды. Если переносимость / другие компиляторы являются проблемой, вам придется взглянуть на что-то еще, но эти функции компилируются, возможно, в две инструкции, занимающие менее 5 часов, в отличие от вспомогательной функции, которая занимает более 100 часов.