算术平方根解法
第一種方法,使用二分法。在一個區間內每次拿中間數的平方來試,如果大了就左移中間數,如果小了就右移。當結果逼近真實值的時候取精度最高的結果。
//二分法求平方根,首尾兩端不斷逼近 float Sqrt(float m){const float eps = 1e-11;//eps用于控制結果的精度 if(m<0){cerr<<"無法求根"<<endl;return -1;}float mid,low,up,last;low = 0,up = m;mid = (low + up)/2;do{if(mid * mid > m)up = mid;elselow = mid;last = mid;mid = (low + up)/2; }while(fabs(last - mid) > eps); //不能使用abs,會提示函數有歧義 ,fabs可以直接傳float參數 return mid; }第二種方法,牛頓迭代法。↓↓↓↓↓↓↓↓以下描述取自百度百科 設r是 的根,選取 作為r的初始近似值,過點 做曲線 的切線L,L的方程為 ,求出L與x軸交點的橫坐標 ,稱x1為r的一次近似值。過點 做曲線 的切線,并求該切線與x軸交點的橫坐標 ,稱 為r的二次近似值。重復以上過程,得r的近似值序列,其中, 稱為r的 次近似值,上式稱為牛頓迭代公式。 用牛頓迭代法解非線性方程,是把非線性方程 線性化的一種近似方法。把 在點 的某鄰域內展開成泰勒級數 ,取其線性部分(即泰勒展開的前兩項),并令其等于0,即 ,以此作為非線性方程 的近似方程,若 ,則其解為 , 這樣,得到牛頓迭代法的一個迭代關系式: 。
簡單來說就是,如要求A的算術平方根,先假設一個值x,然后不斷求(x+a/x)/2=x,不斷迭代。 float SqrtByNt(float m){const float eps = 1e-11;float x = m; float last;//用于記錄上一次迭代的值 do{last = x;x=(x+m/x)/2; }while(fabs(x-last)>eps);return x; }
接下來是卡馬克的神奇平方根算法,其實也是用了牛頓迭代法,但他設置了一個神奇的常數0x5f3759df來計算那個猜測值。 float InvSqrt (float x) {float xhalf = 0.5f*x;int i = *(int*)&x;i = 0x5f3759df - (i>>1);x = *(float*)&i;x = x*(1.5f - xhalf*x*x);x = x*(1.5f - xhalf*x*x);x = x*(1.5f - xhalf*x*x);return 1/x; }
總結
- 上一篇: 九州8508机顶盒安装软件教程记录
- 下一篇: 一个人越想挣钱,越挣不到钱!背后的原因是