快速求平方根,这个好牛逼
生活随笔
收集整理的這篇文章主要介紹了
快速求平方根,这个好牛逼
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/yutianzuijin/article/details/40268445
首先是常規解法,二分法:
float SqrtByBisection(float n) {float low,up,mid,last; low=0,up=(n<1?1:n); mid=(low+up)/2; do{if(mid*mid>n)up=mid; else low=mid;last=mid;mid=(up+low)/2; }while(fabsf(mid-last) > eps);return mid; }?
然后是牛頓迭代法。
好巧妙呀!
float SqrtByNewton(float x) {float val=x;//初始值float last;do{last = val;val =(val + x/val) / 2;}while(fabsf(val-last) > eps);return val; }?
注意,初值選擇很重要。
float SqrtByNewton(float x) {int temp = (((*(int *)&x)&0xff7fffff)>>1)+(64<<23);float val=*(float*)&temp;float last;do{last = val;val =(val + x/val) / 2;}while(fabsf(val-last) > eps);return val; }?
一步到位,不需要迭代的,牛逼的卡馬克算法。是在一段游戲代碼里面的。
float SqrtByCarmack( float number ) {int i;float x2, y;const float threehalfs = 1.5F;x2 = number * 0.5F;y = number;i = * ( int * ) &y; i = 0x5f375a86 - ( i >> 1 ); y = * ( float * ) &i;y = y * ( threehalfs - ( x2 * y * y ) ); y = y * ( threehalfs - ( x2 * y * y ) ); y = y * ( threehalfs - ( x2 * y * y ) ); return number*y; }其實一步也就可以了。
?
總結
以上是生活随笔為你收集整理的快速求平方根,这个好牛逼的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [TPYBoard - Micropyt
- 下一篇: 四十年前的 6502 CPU 指令翻译成