带while循环的Java平方根近似程序

带while循环的Java平方根近似程序,java,math,while-loop,Java,Math,While Loop,我正试图制作一个程序,通过挤压定理来近似一个数的平方根。如果一个数字大于1(简单的例子是100),它将间隔设置为[1100],取中点,如果该数字的平方大于100,它将更新为高并打印新的间隔。如果较低,则会更新为较低,直到它们之间的空间在ε范围内。我的问题是,我似乎无法让它进入else语句中进行低更新。之前的所有输出都是正确的。它正确打印前五行,然后在不更新low的情况下终止 public static void main(String[] args) { System.out.prin

我正试图制作一个程序,通过挤压定理来近似一个数的平方根。如果一个数字大于1(简单的例子是100),它将间隔设置为[1100],取中点,如果该数字的平方大于100,它将更新为高并打印新的间隔。如果较低,则会更新为较低,直到它们之间的空间在ε范围内。我的问题是,我似乎无法让它进入else语句中进行低更新。之前的所有输出都是正确的。它正确打印前五行,然后在不更新low的情况下终止

public static void main(String[] args) {

    System.out.println("Enter a number to find its square root -> ");

    Scanner cin = new Scanner(System.in);
    double number = cin.nextDouble(); 
    double low = 0;
    double high = 0; 
    double midPoint;
    double midPointSqr;
    final double EPSILON = .000001;

        if (number < 0)
            System.out.printf("The square root of %f is NaN%n", number);
        else if (number < 1) {
            low = 0; high = 1;
        }
        else {
            low = 1; 
            high = number;
            midPoint = (low+high)/2; 
            midPointSqr = (midPoint*midPoint);
            System.out.printf("[%.6f, %.6f]%n", low, high);
            high = midPoint;
            System.out.printf("[%.6f, %.6f]%n", low, high);
            while ((Math.abs(midPoint*midPoint)-number) >= EPSILON) {
                midPoint = (low+high)/2;
                if (midPointSqr > number) {
                    high = midPoint;
                    System.out.printf("[%.6f, %.6f]%n", low, high);
                    midPoint = (low+high)/2;
                    midPointSqr = midPoint*midPoint; 
                }
                else if (midPointSqr == number)
                    System.out.println("null");
                else {
                    low = midPoint;
                    System.out.printf("[%.6f, %.6f]%n", low, high);
                    midPoint = (low+high)/2;
                    midPointSqr = midPoint*midPoint;
                }
            }

        }
/*Output should look like this
1 Enter a number to find its square root -> 100
2 [1.000000 , 100.000000]
3 [1.000000 , 50.500000]
4 [1.000000 , 25.750000]
5 [1.000000 , 13.375000]
6 [7.187500 , 13.375000]
7 [7.187500 , 10.281250]
8 [8.734375 , 10.281250]
9 [9.507813 , 10.281250]
10 [9.894531 , 10.281250]
11 [9.894531 , 10.087891]
12 [9.991211 , 10.087891]
13 [9.991211 , 10.039551]
14 [9.991211 , 10.015381]
15 [9.991211 , 10.003296]
16 [9.997253 , 10.003296]
17 [9.997253 , 10.000275]
18 [9.998764 , 10.000275]
19 [9.999519 , 10.000275]
20 [9.999897 , 10.000275]
21 [9.999897 , 10.000086]
22 [9.999991 , 10.000086]
23 [9.999991 , 10.000039]
24 [9.999991 , 10.000015]
25 [9.999991 , 10.000003]
26 [9.999997 , 10.000003]
27 [9.999997 , 10.000000]
28 [9.999999 , 10.000000]
29 [10.000000 , 10.000000]
*/
publicstaticvoidmain(字符串[]args){
System.out.println(“输入一个数字以查找其平方根->”;
扫描仪cin=新扫描仪(System.in);
双倍数字=cin.nextDouble();
双低=0;
双高=0;
双中点;
双中点SQR;
最终双ε=0.000001;
如果(数字<0)
System.out.printf(“f的平方根是NaN%n”,数字);
否则如果(数字<1){
低=0;高=1;
}
否则{
低=1;
高=数量;
中点=(低+高)/2;
中点SQR=(中点*中点);
系统输出打印F(“[%.6f,%.6f]%n”,低,高);
高=中点;
系统输出打印F(“[%.6f,%.6f]%n”,低,高);
while((Math.abs(中点*中点)-number)>=EPSILON){
中点=(低+高)/2;
如果(中点SQR>编号){
高=中点;
系统输出打印F(“[%.6f,%.6f]%n”,低,高);
中点=(低+高)/2;
中点SQR=中点*中点;
}
else if(中点SQR==数字)
System.out.println(“空”);
否则{
低=中点;
系统输出打印F(“[%.6f,%.6f]%n”,低,高);
中点=(低+高)/2;
中点SQR=中点*中点;
}
}
}
/*输出应该如下所示
1输入一个数字以查找其平方根->100
2 [1.000000 , 100.000000]
3 [1.000000 , 50.500000]
4 [1.000000 , 25.750000]
5 [1.000000 , 13.375000]
6 [7.187500 , 13.375000]
7 [7.187500 , 10.281250]
8 [8.734375 , 10.281250]
9 [9.507813 , 10.281250]
10 [9.894531 , 10.281250]
11 [9.894531 , 10.087891]
12 [9.991211 , 10.087891]
13 [9.991211 , 10.039551]
14 [9.991211 , 10.015381]
15 [9.991211 , 10.003296]
16 [9.997253 , 10.003296]
17 [9.997253 , 10.000275]
18 [9.998764 , 10.000275]
19 [9.999519 , 10.000275]
20 [9.999897 , 10.000275]
21 [9.999897 , 10.000086]
22 [9.999991 , 10.000086]
23 [9.999991 , 10.000039]
24 [9.999991 , 10.000015]
25 [9.999991 , 10.000003]
26 [9.999997 , 10.000003]
27 [9.999997 , 10.000000]
28 [9.999999 , 10.000000]
29 [10.000000 , 10.000000]
*/

这是我的代码清理版本:

public static double approximateSqrt(double number) {
    double low = 0;
    double high = 0;
    double midPoint;
    double midPointSqr;
    final double EPSILON = .000001;

    if (number < 0) {
        System.out.printf("The square root of %f is NaN%n", number);
        return Double.NaN;
    } else if (number < 1) {
        low = 0;
        high = 1;
    } else {
        low = 1;
        high = number;
    }
    midPoint = (low + high) / 2;
    midPointSqr = (midPoint * midPoint);

    while (Math.abs(midPointSqr - number) >= EPSILON) {
        System.out.printf("[%.6f, %.6f]%n", low, high);

        if (midPointSqr > number) {
            high = midPoint;
        } else {
            low = midPoint;
        }

        midPoint = (low + high) / 2;
        midPointSqr = (midPoint * midPoint);
    }
    System.out.printf("Final. midpoint=%.6f num=%.6f%n", midPoint, number);
    return midPoint;
}

public static void main(String[] args) {
    System.out.println("Enter a number to find its square root -> ");
    Scanner cin = new Scanner(System.in);
    double number = cin.nextDouble();
    approximateSqrt(number);
}
公共静态双近似QRT(双倍数字){
双低=0;
双高=0;
双中点;
双中点SQR;
最终双ε=0.000001;
如果(数字<0){
System.out.printf(“f的平方根是NaN%n”,数字);
返回Double.NaN;
}否则如果(数字<1){
低=0;
高=1;
}否则{
低=1;
高=数量;
}
中点=(低+高)/2;
中点SQR=(中点*中点);
while(Math.abs(midPointSqr-number)>=EPSILON){
系统输出打印F(“[%.6f,%.6f]%n”,低,高);
如果(中点SQR>编号){
高=中点;
}否则{
低=中点;
}
中点=(低+高)/2;
中点SQR=(中点*中点);
}
System.out.printf(“Final.middpoint=%.6f num=%.6f%n”,middpoint,number);
返回中点;
}
公共静态void main(字符串[]args){
System.out.println(“输入一个数字以查找其平方根->”;
扫描仪cin=新扫描仪(System.in);
双倍数字=cin.nextDouble();
近似QRT(数字);
}

此外,正如您所看到的,我还没有填写0到1之间的数字的意外值,我认为这将是相同的,因为不同的起始时间间隔不同。此外,while循环中的else如果只是一个占位符,稍后将被删除/更新。我不应该使用注释来表示感谢,但我只是想知道wro是什么我不同意我的循环/条件,但是你修复了整个代码,并且使它更干净。非常感谢。