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行,检查的目的是什么?
我搜索了牛顿的方法&#34;并得到了几个解释,但我仍然无法理解。我可以在这里要求直截了当的解释吗?
答案 0 :(得分:3)
Q1:请注意t
随循环的每次迭代而变化,因此最初c/t
== 1时,它会在此之后赢得。
Q2:我们希望循环继续,直到我们得到答案&#34;足够接近&#34;,由err
定义。
答案 1 :(得分:2)
牛顿方法用于逼近实值函数的根。见here。
当你计算根到双值时,你实际上试图求解F(x) = X^2 - C
,其中C是双精度,你会试图找到使方程为零的x。
现在Newton's Method
通过一系列猜测来逼近这一点。通过每次猜测(因为此函数具有适当的属性),我们更接近平方根。增量近似实际上是在每次猜测(t)时计算图形的切线,然后选择那个作为该点的猜测并在步骤(c / t + t)/ 2中移近。在某一点上,我们非常接近并且我们不希望该函数永远继续,所以我们有第3行来检查我们的下一个估计是否与当前近似有一定距离。如果下一个近似值比err * t更接近,我们就不会继续了。我们足够接近。