计算平方根的方法(二分法、牛顿迭代)

1.二分法求平方根
 
算法过程描述:
Input: num, 精度e
Output:根号num
1.low = 0, high = num
2.若精度不达到要求(e0 > e)则继续;否则输出guess,程序结束
3.guess = (low + high) / 2
4.如果guess^2 > num,则high = guess; 重新计算精度e0 = guess^2 - num; 继续执行步骤2
5.如果guess^2 <= num,则low = guess; 重新计算精度e0 = num - guess^2; 继续执行步骤2
 1 public double bi_sqrt(double num, double e) {
 2             double low = 0;
 3             double high = num;
 4             double guess = num / 2;
 5             double e0 = e+1;//为了有第一次循环;使e0 > e
 6             int count = 0;
 7             while (e0 > e) {
 8                 guess = (low + high) / 2;
 9                 if (guess * guess > num) {
10                     high = guess;
11                     e0 = guess*guess - num;
12                 } else {
13                     low = guess;
14                     e0 = num - guess*guess;
15                 }
16                 count++;
17                 System.out.println("times: " + count + " guess: " + guess);
18             }
19             return guess;
20 }
 
2. 牛顿迭代法
 
计算步骤:为了求根号a的近似值,先随便猜一个近似值x,然后不断令x等于x和a/x的平均数。
基本原理:f(x)=x^2-a 不断用(x,f(x))的切线来逼近方程x^2-a=0的根。根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2。
 
 1         public double newton_sqrt(double num, double e){
 2             double guess = num / 2;
 3             double e0 = e + 1;
 4             int count = 0;
 5             while(e0 > e){
 6                 guess = (guess + num  / guess) / 2;
 7                 e0 = guess * guess - num;
 8                 count++;
 9                 System.out.println("times: " + count + " guess: " + guess);
10             }
11             return guess;
12         }

3.性能对比

1     public static void main(String[] args) {
2         System.out.println("二分法");
3         bi_sqrt(10,0.00001);
4         System.out.println("牛顿迭代");
5         newton_sqrt(10,0.00001);
6     }
 1 二分法
 2 times: 1 guess: 2.5
 3 times: 2 guess: 1.25
 4 times: 3 guess: 1.875
 5 times: 4 guess: 2.1875
 6 times: 5 guess: 2.34375
 7 times: 6 guess: 2.265625
 8 times: 7 guess: 2.2265625
 9 times: 8 guess: 2.24609375
10 times: 9 guess: 2.236328125
11 times: 10 guess: 2.2314453125
12 times: 11 guess: 2.23388671875
13 times: 12 guess: 2.235107421875
14 times: 13 guess: 2.2357177734375
15 times: 14 guess: 2.23602294921875
16 times: 15 guess: 2.236175537109375
17 times: 16 guess: 2.2360992431640625
18 times: 17 guess: 2.2360610961914062
19 times: 18 guess: 2.2360801696777344
20 times: 19 guess: 2.2360706329345703
21 times: 20 guess: 2.2360658645629883
22 牛顿迭代
23 times: 1 guess: 2.25
24 times: 2 guess: 2.236111111111111
25 times: 3 guess: 2.2360679779158037

 

 

 

posted on 2016-05-02 17:09  hogarth  阅读(811)  评论(0)    收藏  举报

导航