[英]Fastest way to convert a float to int in C++
在 C++ 中将浮点数转换为整数(向零舍入)的最快和最有效的方法是什么? 是吗
long ftoint(float x)
{
unsigned int e = (0x7F + 31) - ((* (unsigned int*) &x & 0x7F800000) >> 23);
unsigned int m = 0x80000000 | (* (unsigned int*) &x << 8);
return int((m >> e) & -(e < 32));
}
?
让我们比较以下两个:
long ftoint(float x)
{
unsigned int e = (0x7F + 31) - ((* (unsigned int*) &x & 0x7F800000) >> 23);
unsigned int m = 0x80000000 | (* (unsigned int*) &x << 8);
return int((m >> e) & -(e < 32));
}
long ftointfast(float x){ return x; }
带有 -O3 的 Clang 产生:
ftoint(float): # @ftoint(float)
movd eax, xmm0
mov ecx, eax
shr ecx, 23
movzx edx, cl
mov ecx, 158
sub ecx, edx
shl eax, 8
or eax, -2147483648
shr eax, cl
xor edx, edx
cmp ecx, 32
cmovb edx, eax
movsxd rax, edx
ret
ftointfast(float): # @ftointfast(float)
cvttss2si rax, xmm0
ret
我不精通汇编,但我确信你不能比一条指令更快地掌握它。
std::floor(arg)
计算不大于 arg 的最大整数值。 它返回一个浮点值。 如果您不需要浮点值而只需要整数,则不需要std::floor
。 您也不需要将您的解决方案与std::floor
进行比较,因为它会执行您不需要的操作。 当然,您可以只写(假设x
实际上适合long
的范围):
long y = x;
或者是明确的
long y = static_cast<long>(x);
大概与
long ftoint(float x)
{
return (long)x;
}
(或者static_cast
如果你讨厌 C 风格的强制转换)
实际上,您不需要函数。 你可以只写演员表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.