这是我的学校作业代码。我应该用牛顿法和开始猜测法来创建一个可以计算任何数字的平方根的代码。当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);
}}
1条答案
按热度按时间jk9hmnmh1#
浮点数的精度有限。
最重要的概念是最小精度单位(ulp)。这是数字的变化量,如果你摇摆它的最低有效位。
这取决于你从哪个号码开始;但对于
1.0f
,ulp是1.1920929E-7
. (你可以用Math.ulp
方法)。所以,假设你想从1阶中找到更好的解决方案,使用float
,你不能在1e-8范围内到达。使用
double
取而代之的是:精度仍然有限,但ulp要小得多:2.2e-16。