我目前正在学习一门课程,讲师使用以下代码在 Java 中实现平方根功能 -
public class Sqrt {
public static void main(String[] args) {
// read in the command-line argument
double c = Double.parseDouble(args[0]);
double epsilon = 1.0e-15; // relative error tolerance
double t = c; // estimate of the square root of c
// repeatedly apply Newton update step until desired precision is achieved
while (Math.abs(t - c/t) > epsilon*t) {
t = (c/t + t) / 2.0;
}
// print out the estimate of the square root of c
System.out.println(t);
}
}
但是,如果我将 while 循环条件稍微更改为而while (Math.abs(t - (c / t)) >= epsilon)不是while (Math.abs(t - (c / t)) >= t * epsilon),则对于某些输入(如 234.0.0),程序会陷入无限循环。
我使用了 Eclipse 调试器,发现我的代码在某个点之后返回的 t 值接近 234 的平方根,但仍然大于 EPSILON。并且使用更新公式,每次迭代后都会产生相同的 t 值,因此循环会永远卡在那里。
有人可以解释为什么程序在使用时失败>= EPSILON但在使用时工作得很>= t * EPSILON好吗?据我了解,鉴于 EPSILON 的值极小,t * EPSILON 最终不应与 EPSILON 相差太大,但在程序中实现时差异很大。
Helenr
拉风的咖菲猫
相关分类