This question already has answers here:
What's a proper way of type-punning a float to an int and vice-versa?

(8个答案)


3年前关闭。




据我对strict aliasing rule的了解,fast inverse square root的此代码将导致C++中的未定义行为:
float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y; // type punning
    i  = 0x5f3759df - ( i >> 1 );
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );

    return y;
}

此代码确实会导致UB吗?如果是,如何以符合标准的方式重新实现?如果没有,为什么不呢?

假设:在调用此函数之前,我们已经以某种方式检查了浮点数是否为IEEE 754 32位格式sizeof(long)==sizeof(float)和平台为低端字节序。

最佳答案

您应该使用memcpy。 AFAIK这是唯一符合标准的方式,编译器足够聪明,可以用一条单词移动指令代替调用。有关这些声明背后的原因,请参见this question

关于c++ - 如何在没有未定义行为的情况下实现快速反sqrt? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24405129/

10-12 16:15