我正在尝试计算平方根的牛顿方法的不同实现。一个重要的决定是何时终止算法。
显然,使用y*y
和x
的y
平方根的当前估计值之间的绝对差是不行的x
,因为对于较大的值,x
它可能无法以足够的精度表示其平方根。
所以我应该使用相对标准。我天真地会使用这样的东西:
static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x) / x < EPS;
}
这似乎工作得很好。但最近我开始阅读 Kernighan 和 Plauger 的The Elements of Programming Style,他们在第 1 章中给出了相同算法的 Fortran 程序,其终止标准(用 C 语言翻译)是:
static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}
两者在数学上是等价的,但是有理由选择一种形式而不是另一种形式吗?