浮点数的平方根倒数常用于计算正规化矢量。3D图形程序需要使用正规化矢量来实现光照和投影效果,因此每秒都需要做上百万次平方根倒数运算,而在处理坐标转换与光源的专用硬件设备出现前,这些计算都由软件完成,计算速度亦相当之慢。在1990年代这段代码开发出来之时,多数浮点数操作的速度更是远远滞后于整数操作。因而针对正规化矢量算法的优化就显得尤为重要。下面陈述计算正规化矢量的原理:
要将一个矢量标准化,就必须计算其欧几里德范数,以求得矢量长度,为此便需对矢量的各分量的平方和求平方根;而当求取到其长度,并以之除该矢量的每个分量后,所得的新矢量就是与原矢量同向的单位矢量。
可见标准化矢量时,对矢量分量计算平方根倒数实为必需,所以,对平方根倒数计算算法的优化对计算正规化矢量也大有裨益。
为了加速图像处理单元计算,《雷神之锤III竞技场》使用了平方根倒数速算法。
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(对浮点数的邪恶位级hack) 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; }
关于这段代码的更多解读请参考维基百科。