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 次 |
最近记录: |