一個數開根號的二分法和牛頓法
阿新 • • 發佈:2019-01-01
偶然在知乎上看到求解一個數開根號怎麼求,閒來無事練習下C;
首先自己想到的就是二分法,寫出來了才知道這個叫二分法,是一個比較直觀的方法,比如求in的開根號,設定一個low,一個high,每次用low和high 的中值的平方去和in比較,在誤差範圍之內就退出,誤差大就繼續迭代,然後根據每次比較的結果更新low和high 的值,最後得到一個理想的結果。
牛頓法是在網上查的,做二分法時,感覺到可能迭代的太慢,二分肯定不是最優的,剛好看到牛頓迭代,在紙上畫了下感覺也比較簡單,就是求一個二次方程的根,根據切線方法來迭代,一下子找到迭代的規則,就可以寫出來了。
下面是二分法和牛頓法的求根號的結果,按理說是牛頓比較快,感興趣的可以研究下:
#include <stdio.h> #include <stdlib.h> #include <math.h> double twofen(double in) { double out; double low,high; int i=0; if (in<=0) { printf("fushu ,shurucuowu!"); return 0; } low=0; high=in; while(fabs(in-out*out)>0.0001) { out =(low+high)/2; if(out*out>in) {high=out;} else if(out*out<in) {low=out;} i++; } return out; } double newton(double in) { double current; double next; current=1; while(fabs(next*next-in)>0.0001) { next=(current+in/current)/2; current=next; } return next; } void main() { double in; printf("shuru yige zhengshu :\n"); scanf("%lf",&in); printf("2fen(%lf) de jieguo shi %lf\n",in,twofen(in)); printf("---------------------\n"); printf("newton(%lf)de jieguo shi %lf\n",in,newton(in)); printf("finish"); }
注意的是都是double型別,如果不小心設定了int型,或者不小心用了abs,沒用fabs就會得不到正確的結果哦。