1. 程式人生 > >一個數開根號的二分法和牛頓法

一個數開根號的二分法和牛頓法

偶然在知乎上看到求解一個數開根號怎麼求,閒來無事練習下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就會得不到正確的結果哦。