快速求平方根

来源:互联网 发布:祖冲之的割圆术 知乎 编辑:程序博客网 时间:2024/04/29 10:20

 求平方根常用的算法为牛顿逐步逼近方法:
       例如,求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! (不知道是不是猜出来的?)

          
           

原创粉丝点击