【云栖社区002-二分估值法】要求不用数学库,求 sqrt (2)精确到小数点后10位(Java版)

如题

  • 初步审题的时候,想到的是暴力搜索:初步设置一个合法的种子,依次按照1e-2,1e-3,1e-4,1e-5,1e-6 , 1e-7...暴力搜索,额,就是太麻烦了。

打比赛搜索写多了,一看见题目就想到搜索。。。

  • 细想了一下,进行优化,二分估值法,貌似很合适.
  • 试了试,又调了数学库求值开根号2 ,没问题。

代码

package com.szs;
/**
* @description 要求不用数学库,求 sqrt (2)精确到小数点后 10位
* @author Administrator
*/
public class Main {
public static void main(String[] args) {
//手写二分估值
System.out.println(myCalculate(1.4,1.4,1.5));
//调用函数输出
System.out.println("----------sqrt= "+Math.sqrt(2.0));
}
//根号2约等于 1.414
private static double myCalculate(double ans,double low,double high) {
double mid = 0;
// 二分法,结束条件:差值小于等于1e-10即可
while(high-low>1e-10){ mid = (high+low)/2.0;
System.out.println("-----------mid= "+mid+" mid*mid= "+mid*mid);
//二分,逐步向中间值收拢
if(mid*mid <= 2.0){
low=mid;
}
else{
high=mid;
} } return mid;
} }

测试输出结果

-----------mid= 1.45  mid*mid= 2.1025
-----------mid= 1.4249999999999998 mid*mid= 2.0306249999999997
-----------mid= 1.4124999999999999 mid*mid= 1.9951562499999995
-----------mid= 1.4187499999999997 mid*mid= 2.0128515624999994
-----------mid= 1.415625 mid*mid= 2.0039941406249997
-----------mid= 1.4140625 mid*mid= 1.99957275390625
-----------mid= 1.41484375 mid*mid= 2.0017828369140624
-----------mid= 1.414453125 mid*mid= 2.0006776428222657
-----------mid= 1.4142578125 mid*mid= 2.0001251602172854
-----------mid= 1.41416015625 mid*mid= 1.999848947525024
-----------mid= 1.414208984375 mid*mid= 1.9999870514869693
-----------mid= 1.4142333984375002 mid*mid= 2.000056105256081
-----------mid= 1.4142211914062501 mid*mid= 2.0000215782225137
-----------mid= 1.414215087890625 mid*mid= 2.000004314817488
-----------mid= 1.4142120361328125 mid*mid= 1.9999956831429155
-----------mid= 1.4142135620117187 mid*mid= 1.9999999989778732
-----------mid= 1.4142143249511718 mid*mid= 2.0000021568970987
-----------mid= 1.4142139434814451 mid*mid= 2.0000010779373403
-----------mid= 1.414213752746582 mid*mid= 2.00000053845757
-----------mid= 1.4142136573791504 mid*mid= 2.000000268717713
-----------mid= 1.4142136096954345 mid*mid= 2.0000001338477906
-----------mid= 1.4142135858535765 mid*mid= 2.0000000664128312
-----------mid= 1.4142135739326476 mid*mid= 2.000000032695352
-----------mid= 1.4142135679721832 mid*mid= 2.000000015836613
-----------mid= 1.414213564991951 mid*mid= 2.0000000074072433
-----------mid= 1.4142135635018347 mid*mid= 2.0000000031925578
-----------mid= 1.4142135627567767 mid*mid= 2.0000000010852155
-----------mid= 1.4142135623842478 mid*mid= 2.0000000000315445
-----------mid= 1.4142135621979832 mid*mid= 1.9999999995047089
-----------mid= 1.4142135622911156 mid*mid= 1.999999999768127
1.4142135622911156
----调用数学库计算-----sqrt2= 1.4142135623730951
上一篇:Android(java)开发之将double类型,强制保留到小数点后两位解决方法。


下一篇:使用Wireshark 查看查找未被过滤端口