这是我的学校作业代码。我应该使用牛顿方法创建一个可以计算任何数字平方根的代码,然后开始猜测。当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
方法找到它)。因此,假设您尝试使用顺序从1的顺序中找到更好的解决方案float
,那么您将无法获得1e-8的范围。
double
改为使用:您的精度仍然有限,但是ULP小得多:2.2e-16。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句