Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当要求更精确的答案时,平方根计算器会中断_Java_Newtons Method - Fatal编程技术网

Java 当要求更精确的答案时,平方根计算器会中断

Java 当要求更精确的答案时,平方根计算器会中断,java,newtons-method,Java,Newtons Method,这是我的学校作业代码。我应该创建代码,可以使用牛顿的方法和开始猜测来计算任何数字的平方根。当ε为0.0001时,它工作正常,但是我被要求使它更精确。当更改为0.00000001(我的老师要求)时,它会无限循环,因为它重复给出的答案与自身相乘时的目标值不在0.00000001之内,所有进一步的计算都会产生相同的结果 import java.lang.Math.*; public class main { public static void main(String[] args) {

这是我的学校作业代码。我应该创建代码,可以使用牛顿的方法和开始猜测来计算任何数字的平方根。当ε为0.0001时,它工作正常,但是我被要求使它更精确。当更改为0.00000001(我的老师要求)时,它会无限循环,因为它重复给出的答案与自身相乘时的目标值不在0.00000001之内,所有进一步的计算都会产生相同的结果

import java.lang.Math.*;

public class main {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the number you are trying to find the square root of");
    Float input1 = sc.nextFloat();
    Scanner sc2 = new Scanner(System.in);
    System.out.println("Provide a guess to start");
    Float input2 = sc2.nextFloat();
    calc(input1, input2);
    }
    static void calc(Float input1, Float input2) {
       final double epsilon = 0.00000001; 
        float sqr = (input1/input2 + input2)/2;
        do{
        sqr = (input1/input2 + input2)/2;
        input2 = sqr;
        } while (Math.abs(sqr * sqr - input1)>epsilon);
        System.out.println("The square root of " + input1 + " is " + sqr);
        
    }}

浮点数的精度有限

最重要的概念是最小精度单位(ULP)。这是数字在摇动其最低有效位时的变化量

这取决于您的起始号码;但是对于
1.0f
,ULP是
1.1920929E-7
。(您可以使用找到)。因此,假设您正试图从顺序1的东西中找到更好的解决方案,使用
float
,您无法在1e-8范围内找到它


使用
double
:精度仍然有限,但ULP要小得多:2.2e-16。

float
没有足够的精度。使用
double
。作为旁白:这里没有必要使用
Float
:使用
Float
(或者,如建议的那样,
double
)。对于其他所有内容,都有
bigdecimic
和眼泪。