热度 2||
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这个 诡异的数字去减掉这个移位出来的数字,是个啥玩意? 然后再把这个结果当作一个浮点数来看,又是个什么鬼? 就最后那两次迭代能看懂,但也不是随便就能推出来的。 下面这篇文章有详细的推导过程和扩展方法,值得一看。 |