当要求更精确的答案时,平方根计算器会中断
Square root calculator breaks when asked for more precise answer
这是我的学校作业代码。我应该创建可以使用牛顿法和开始猜测来计算任何数字的平方根的代码。当 epsilon 为 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
。 (您可以使用 Math.ulp
method 找到它)。因此,假设您正在尝试使用 float
从 1 阶的事物中找到更好的解决方案,您无法在 1e-8 范围内找到它。
改用double
:你的精度仍然有限,但ULP要小得多:2.2e-16。
这是我的学校作业代码。我应该创建可以使用牛顿法和开始猜测来计算任何数字的平方根的代码。当 epsilon 为 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
。 (您可以使用 Math.ulp
method 找到它)。因此,假设您正在尝试使用 float
从 1 阶的事物中找到更好的解决方案,您无法在 1e-8 范围内找到它。
改用double
:你的精度仍然有限,但ULP要小得多:2.2e-16。