私は、平方根を計算するためのニュートン法のさまざまな実装を試しています。 1つの重要な決定は、いつアルゴリズムを終了するかということです。どの浮動小数点比較がより正確で、なぜですか?
明らかにそれがx
の値が大きいことは十分との平方根を表すために可能ではないかもしれないので、y*y
とy
はx
の平方根の現在の推定値であるx
の差の絶対値を使用するようにしないだろう精度。
だから、私は相対的な基準を使うことになっています。純粋に私はこのようなものを使用したでしょう:
static int sqrt_good_enough(float x, float y) {
return fabsf(y*y - x)/x < EPS;
}
これはうまくいくようです。しかし、最近、私はカーニハンとPlaugerのプログラミングスタイルの要素を読み始めており、それらは、第1章では、同じアルゴリズムのためのFortranプログラムを与え、その終了基準、Cに翻訳され、次のようになります。
static int sqrt_good_enough(float x, float y) {
return fabsf(x/y - y) < EPS * y;
}
両方数学的には等価である
ですが、一方の形式を他方よりも優先する理由はありますか?
これは、コンピューター上の数値計算を対象としたベータ版StackExchangeコミュニティ[scicomp](http://scicomp.stackexchange.com)にとって大きな質問です。 –