Quake III公开源码后,有人在game/code/q_math.c里发现了这样一段代码。 它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))快4倍:
float Q_rsqrt( float number ){
long i;
float x2, y;
const float 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;
}
经过验证,的确可以实现开方的功能,且精度很好。单 看代码,很费解的,把一个浮点数的内存数据往右移 一位,是个啥鬼东西?费解。然后再用0x5f3759df这个 诡异的数字去减掉这个移位出来的数字,是个啥玩意? 然后再把这个结果当作一个浮点数来看,又是个什么鬼? 就最后那两次迭代能看懂,但也不是随便就能推出来的。
下面这篇**有详细的推导过程和扩展方法,值得一看。 |