2

関連:

ただし、x86 での80 ビット IEEE 浮動小数点(セクション 8.2 を参照) に関しては

特に、デフォルトでスケーリングされるため、オペランド間の表現可能な値の数を使用するこの実装が気に入っています。

1 つのユース ケースは、2 つの値が互いに近づく数値近似であり、それらが十分に近いかどうかを確認する必要があります。


ps 実装言語はDになりますが、翻訳できます。また、基になる型が何であれ自動的に処理できる実装 (たとえば、64 ビット実数しか利用できない場合) が理想的です。

現在使用中のコード:

4

2 に答える 2

2

Dには(私が知る限り)80ビットの実数が組み込まれているので、イプシロン値と比較する標準的なアプローチを使用しないのはなぜですか。米国の通貨など、事前に大まかな範囲がわかっている場合、これは固定値になる可能性があります。

if (abs (a - b) < 1e-6) // effectively equal

または、平均の100万分の1などの許容可能な相対誤差:

if (abs (a - b) < ((a + b) / 2) / 1e6) // effectively equal

私はDを知らないことを覚えておいてください、上記のコードは説明のみを目的としています。

于 2008-12-10T06:04:13.930 に答える
0

私の現在の解決策は

bool Near(real a, real b, int count = 5)
{
    // Returns the number of mantissa bits which are equal in x and y.
    int i = std.math.feqrel!(real)(a,b);
    return i + count >= real.mant_dig;
}

これは、入力の不一致ビットの数を示します。これが2の累乗の近くでどれだけうまく機能するかはわかりません。

于 2008-12-10T06:03:58.143 に答える