1
public static double sqrt(double c)
{
    if (c < 0) return Double.NaN;
    double t = c;                          // line 1
    double err = 1e-15;                    // line 2
    while (Math.abs(t - c/t) > err * t)    // line 3
        t = (c/t + t) / 2.0;           // line 4
    return t;
}

Q1:我对第1行和第4行的变量t感到困惑:既然t = c,那么c/t = 1,那么第4行是什么意思?

Q2:第3行,检查的目的是什么?

我搜索了“牛顿法”并得到了几个解释,但我仍然无法理解。我可以在这里要求一个直截了当的解释吗?

4

2 回答 2

3

Q1:请注意,t循环的每次迭代都会发生变化,所以 while c/t==1 最初,它不会在那之后。

Q2:我们希望循环继续,直到我们得到一个“足够接近”的答案,如定义err

于 2014-05-23T13:13:54.533 回答
2

牛顿法用于逼近实值函数的根。见这里

当您将根计算为 double 值时,您实际上是在尝试求解F(x) = X^2 - CC 是 double 的位置,并且您将尝试找到使等式为零的 x。

现在Newton's Method通过一系列猜测来近似这个。通过每次猜测(因为此函数具有适当的属性),我们更接近平方根。增量近似实际上是在每个猜测(t)处计算图形的切线,然后选择该点作为该点的猜测,并在步骤(c/t + t)/2 中更接近。在某个时刻,我们变得非常接近,我们不希望函数永远继续下去,所以我们有第 3 行来检查我们的下一个估计是否与当前近似值有一定的距离。如果下一个近似值比 err*t 更接近,我们就不必费心继续。我们已经足够接近了。

于 2014-05-23T13:30:44.150 回答