浮动和长期之间的异常转换

Coo*_*mes 4 c floating-point casting bit-manipulation

我发现了一个非常复杂的函数,这是一个快速平方根的实现.老实说,我不明白这个功能是如何工作的,但是a long和a 之间的以下转换float引起了我的注意:

i  = *(long *) &y; 
Run Code Online (Sandbox Code Playgroud)

我留下完整的代码

inline float Q_rsqrt(float number)
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

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

    return y;
}
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 7

演员只是将这些位重新解释ylong可以对它们执行整数运算.

有关该算法的解释,请参阅Wikipedia:快速反平方根.

该代码利用了在目标平台上的知识sizeof(long) == sizeof(float).

@R ..还有助于在评论中添加以下内容:

它也是无效的C - 它是一个别名违规.这个程序的正确版本需要使用memcpy或者可能(这不太清楚,它是正确的,但真正的编译器记录了对它的支持) - union基于类型的惩罚.OP代码中的版本肯定会被真正的编译器"错误编译"(即以与作者的意图不同的方式).

这意味着代码不仅是特定于体系结构的,而且也是特定于编译器的.

  • 它也是无效的C - 它是一个别名违规.这个程序的正确版本需要使用`memcpy`或者可能(这不太清楚,它是正确的,但真正的编译器记录了对它的支持)`union`-based punning.OP代码中的版本肯定会被真正的编译器"错误编译"(即以与作者的意图不同的方式). (2认同)
  • 唯一的字节序假设是浮点和整数字节序匹配.实际上,这始终是正确的. (2认同)