有人在Quake III的源代码里面发现这么一段用来求平方根的代码:
/*
================
SquareRootFloat
================
*/
float SquareRootFloat(float number) {
long i;
float x, y;
const float f = 1.5F;
x = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 ); //注意这一行
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
return number * y;
}
普渡大学的数学家Chris Lomont采用暴力方法得到的更好上那么一丁点的值是:0x5f375a86
学过数值分析就知道,算法里面求平方根一般采用的是无限逼近的方法,比如牛顿迭代法,卡马克的不同之处在于,
他选择了一个神秘的猜测值0x5f3759df作为起始,使得整个逼近过程收敛速度暴涨,对于Quake III所要求的
精度10的负三次方,只需要一次迭代就能够得到结果。
From:http://sd.csdn.net/n/20060607/91403.html
original url from Blog: http://sd.csdn.net/n/20060607/91403.html