开方算法在语言的库函数里面都有,且会比下面讲到的快很多。
第一:二分查找法。
算法逻辑:
- 求x的开平方值。
- 判断x是否大于1,如果大于1,则最小值为1,最大值为x。
- 判断x是否小于1,如果小于1,则最小值为x,最大值为1。
- 求中值,计算中值的平方减去x 是否在误差允许范围内,如果是,则返回。
- 如果中值的平方大于x,则将估算最大值设置为中值。如果中值的平方小于x,则将估算最小值设置为x。
- 循环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 }
第二:牛顿迭代法
算法逻辑:
- 估算x的开方值g就等于x。
- 计算g的平方减去x 的值是否在误差范围内。
- 如果在,则返回g。
- 如果不在,则估算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 }