平方根を計算するためのニュートン法のさまざまな実装を試しています。重要な決定の 1 つは、アルゴリズムをいつ終了するかです。
y*y
との間の絶対差を使用することは明らかに適切x
ではありません。y
の平方根の現在の推定値は です。これはx
、 の値が大きいと、x
その平方根を十分な精度で表すことができない可能性があるためです。
したがって、相対的な基準を使用することになっています。単純に、私は次のようなものを使用していたでしょう:
static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x) / x < EPS;
}
そして、これは非常にうまく機能しているようです。しかし最近、カーニハンとプラウガーのThe Elements of Programming Styleを読み始め、第 1 章で同じアルゴリズムの Fortran プログラムを提供しています。その終了基準を C に翻訳すると、次のようになります。
static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}
どちらも数学的には同等ですが、どちらか一方を優先する理由はありますか?