Замедление приведения типа float-> int в основном происходит при использовании инструкций x87 FPU на x86. Чтобы выполнить усечение, режим округления в управляющем слове FPU необходимо изменить на округление до нуля и обратно, что имеет тенденцию быть очень медленным.
При использовании SSE вместо инструкций x87 доступно усечение без изменения контрольного слова. Вы можете сделать это, используя параметры компилятора (например, -mfpmath=sse -msse -msse2
в GCC) или скомпилировав код как 64-битный.
В наборе команд SSE3 есть инструкция FISTTP
для преобразования в целое число с усечением без изменения управляющего слова. Компилятор может сгенерировать эту инструкцию, если ему предписано принять SSE3.
В качестве альтернативы функция C99 lrint()
преобразует в целое число с текущим режимом округления (от округления до ближайшего, если вы его не изменили). Вы можете использовать это, если удалите термин copysignf
. К сожалению, эта функция все еще не повсеместна после более чем десяти лет.