floatQ_rsqrt( float number ) { long i; float x2, y; constfloat threehalfs = 1.5F;
x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y; }
这是在《雷神之锤 III 竞技场》源代码中的一个函数,功能是计算 平方根倒数x1.
在 3D 游戏场景的计算机图形学中,要求取照明和投影的光照与反射效果,就需要对一个曲面上的多个点坐标计算平方根倒数,即
其中 My+223Ey 为表示浮点数 y 的 32 比特二进制的整型,Mx+223Ex 为表示浮点数 x 的 32 比特二进制的整型,23×223(127−σ) 是一个常数。
文首程序中 i = * ( long * ) &y; 首先将浮点数的 32 比特二进制转换为整型,然后 i = 0x5f3759df - ( i >> 1 ) 与刚刚推导出的公式对应,23×223(127−σ)=0x5f3759df。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
floatQ_rsqrt( float number ) { long i; float x2, y; constfloat threehalfs = 1.5F;
x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df - ( i >> 1 ); // what the fuck? y = * ( float * ) &i; y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
讨论
评论