求平方根常用的算法为牛顿逐步逼近方法:
例如,求2的平方根:
猜测 商 平均值
1 2/1 = 2 ( 2 + 1) / 2 = 1.5
1.5 2/1.5 = 1.3333 (1.3333 + 1.5)/2 = 1.4167
1.4167 2/1.4167 = 1.4118 ( 1.4167 + 1.4118) = 1.4142
1.4142 ....... ...............
继续这个过程就可以求出2的平方根的近似值(当然要给个精度)
用过程语言描述(lisp):
(define (sqt - inter guess x))
(if (good - enough ? guess x)
gess
(sqrt - iter (improve guess x)
x)))
改进猜测的方式就是求出它与被开方数除以上一个猜测的平均值:
(define (improve guess x)
(average guess (/ x guess))
其中
(define (average x y))
(/ (x + y) 2 )
这里误差值为(0.001)
(define (good - enouge x y )
( < (abs (- (square guess) x)) 0.001 ))
这个guess看来是关键,猜得越好就算得越少,在游戏编程中就是要快!
下面这个是QUAKE3中使用的算法:
float InvSqrt(float x);
{
float xhalf = 0.5*x;
int i = *(int*)&x; // get bits for floating value
i = 0x5f3759df- (i>>1); // gives initial guess y0
x = *(float*)&i; // convert bits back to float
x = x*(1.5-xhalf*x*x); // Newton step, repeating increases accuracy
}
很快就求出来了,这个0x5f3759df (十进制: 1597340127 ) 就是 guess! (不知道是不是猜出来的?)