平方根的牛顿迭代法
上述笔算开方方法是我们大多数人上学时课本附录给出的方法,实际中运算中太麻烦了。我们可以采取下面办法
比如136161这个数字,首先我们找到一个和136161的平方根比较接近的数,任选一个,比方说300到400间的任何一个数,这里选350,作为代表。 我们先计算0.5(350+136161/350),结果为369.5。 然后我们再计算0.5(369.5+136161/369.5)得到369.0003,我们发现369.5和369.0003相差无几,并且,369²末尾数字为1。我们有理由断定369²=136161。 一般来说,能够开方开的尽的,用上述方法算一两次基本结果就出来了。再举个例子:计算 。首先我们发现600²<469225<700²,我们可以挑选650作为第一次计算的数。即算0.5(650+469225/650)得到685.9。而685附近只有685²末尾数字是5,因此685²=469225。从而 。 对于那些开方开不尽的数,用这种方法算两三次精度就很可观了,一般达到小数点后好几位。 实际中这种算法也是计算机用于开方的算法。
用Ruby求平方根.(注:sqrt = square root平方根) module MyMath def sqrt(num,rx=1,e=1e-10) #参数1,需要求平方根的目标;参数2,迭代区间;参数3,精度 num*=1.0 #目标初始化 (num-rx*rx).abs < e ? rx : sqrt(num,(num/rx+rx)/2,e) #计算平方根 endendinclude MyMathputs sqrt(2) #求2的平方根puts sqrt(2,5,0.01) #求2的平方根+迭代区间与精度。C语言版求平方根 double Sqrt(double a,double p)//a是被开平方根数,p是所求精度{ double x=1.0;double cheak; do { x = (a / x + x) / 2.0; cheak = x * x - a; } while((cheak >= 0 ? cheak : -cheak) > p); return x;}int main(){ printf(%.4f\n,Sqrt(2.0,0.0001)); printf(%.4f\n,Sqrt(0.09,0.0001)); return 0;}输出结果:
1.4142
0.3000