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)
演员只是将这些位重新解释y为long可以对它们执行整数运算.
有关该算法的解释,请参阅Wikipedia:快速反平方根.
该代码利用了在目标平台上的知识sizeof(long) == sizeof(float).
@R ..还有助于在评论中添加以下内容:
它也是无效的C - 它是一个别名违规.这个程序的正确版本需要使用
memcpy或者可能(这不太清楚,它是正确的,但真正的编译器记录了对它的支持) -union基于类型的惩罚.OP代码中的版本肯定会被真正的编译器"错误编译"(即以与作者的意图不同的方式).
这意味着代码不仅是特定于体系结构的,而且也是特定于编译器的.
| 归档时间: |
|
| 查看次数: |
99 次 |
| 最近记录: |