开平方根算法

开方算法在语言的库函数里面都有,且会比下面讲到的快很多。

第一:二分查找法。

算法逻辑:

  1. 求x的开平方值。
  2. 判断x是否大于1,如果大于1,则最小值为1,最大值为x。
  3. 判断x是否小于1,如果小于1,则最小值为x,最大值为1。
  4. 求中值,计算中值的平方减去x 是否在误差允许范围内,如果是,则返回。
  5. 如果中值的平方大于x,则将估算最大值设置为中值。如果中值的平方小于x,则将估算最小值设置为x。
  6. 循环4-5步。

代码如下:

 1 double sqrt(double z)
 2 {
 3     double low =0;
 4     double high = 0;
 5     double x = 0;
 6     if(z==1)
 7     {
 8         x = 1;
 9         return x;
10     }
11     if(z<1)
12     {
13         low = z;
14         high = 1;
15     }
16     if(z>1)
17     {
18         low = 1;
19         high = z;
20     }
21     double eps = 0.0000001;
22     while(1)
23     {
24         double mid = (low+high)/2;
25         double tmp = mid*mid;
26         if(abs(tmp-z) < eps)
27         {
28             x = mid;
29             break;
30         }
31         if(tmp > z)
32         {
33             high = mid;
34         }else{
35             low = mid;
36         }
37     }
38     return x;
39 }

 

 

第二:牛顿迭代法

算法逻辑:

  1. 估算x的开方值g就等于x。
  2. 计算g的平方减去x 的值是否在误差范围内。
  3. 如果在,则返回g。
  4. 如果不在,则估算g的值为g=(g+z/g)/2。并重新执行第二步。直到计算结果符合误差要求。

代码如下:

 1 double sqrt_NewTon(double z)
 2 {
 3     double eps = 0.00001;
 4     double g = z;
 5     while(abs(g*g-z) > eps)
 6     {
 7         g = (g+z/g)/2;
 8     }
 9     return g;
10 }

 

posted on 2017-08-18 18:21  ^~~^  阅读(1204)  评论(0编辑  收藏  举报

导航