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