牛頓迭代法求平方根

牛頓迭代法的作用是使用迭代法來求解函數(shù)方程的根,簡單的說就是不斷地求取切線的過程.對于形如f(x)=0的方程,首先任意的估算一個(gè)解x0,再把該估計(jì)值代入原方程中.由于一般不會(huì)正好選擇到正確的解,所以有f(x0)=a.這時(shí)計(jì)算函數(shù)在x0處的斜率,和這條斜率與x軸的交點(diǎn)x1. f(x)=0中精確解的意義是,當(dāng)取得解的時(shí)候,函數(shù)值為零(即f(x)的精確解是函數(shù)的零點(diǎn)).因此,x1比x0更加的接近精確地解.只要以此方法不分段的更新x,就可以取得無線接近的精確地解.但是也有可能會(huì)遇到牛頓迭代法無法收斂的情況.比如函數(shù)有多個(gè)零點(diǎn),或者是函數(shù)不連續(xù)的時(shí)候.

設(shè)x的m次方根為a


const float EPS = 0.00001;   
double sqrt(double x) {   
    if(x == 0) return 0;   
    double result = x; /*Use double to avoid possible overflow*/   
    double lastValue;   
    do{   
        lastValue = result;   
        result = result / 2.0f + x / 2.0f / result;   
    }while(abs(result - lastValue) > EPS);  
 return (double)result;  
 } 

更快的方法
在游戲雷神之錘III中有一段求平方根的代碼如下:

float Q_rsqrt( float number ) {   
    long i; float x2, y; const float threehalfs = 1.5F;  
    x2 = number * 0.5F;   
    y = number;   
    i = * ( long * ) &y; // evil floating point bit level hacking   
    i = 0x5f3759df - ( i >> 1 ); // what the fuck?   
    y = * ( float * ) &i;   
    y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration   
    // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed此處迭代次數(shù)越多,精度越高.  
    #ifndef Q3_VM #  
    ifdef __linux__ assert( !isnan(y) ); // bk010122 - FPE?  
    #endif  
    #endif 
return y;   
}

這段代碼的作用就是求數(shù)number的平方根,并返回它的倒數(shù).經(jīng)過測試,它的效率比牛頓法要快幾十倍,也比C++標(biāo)準(zhǔn)的sqrt()函數(shù)要快好幾倍.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容