繁体   English   中英

在 C++ 中将浮点数转换为 int 的最快方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM