17

これまで、浮動小数点数の等価性を扱った多くの投稿を見てきました。「x と y が等しいかどうかをどのように判断すればよいですか?」などの質問に対する標準的な回答です。は

abs(x - y) < epsilon

ここで、epsilon は固定の小さな定数です。これは、「オペランド」x と y が、丸め誤差が含まれる計算の結果であることが多いためです。そのため、標準の等値演算子 == は意味するものではなく、実際に確認する必要があるのは、x と y が近いかどうかです。 、等しくありません。

ここで、x が y と「ほぼ等しい」場合、x*10^20 も y*10^20 と「ほぼ等しい」はずであると感じています。 " 何に?)。しかし、これらの大きな数では、上記のテストは失敗します。つまり、そのソリューションは「スケーリング」しません。

この問題にどう対処しますか?数値を再スケーリングするか、イプシロンを再スケーリングする必要がありますか? どのように?(それとも私の直感が間違っているのでしょうか?)

ここに関連する質問がありますが、受け入れられた回答は好きではありません.reinterpret_castのことは私には少し難しいようです. 簡単なテストを提供してみてください。

4

5 に答える 5

20

それはすべて、特定の問題ドメインに依存します。はい、相対誤差を使用すると、一般的にはより正確になりますが、余分な浮動小数点除算が必要になるため、効率が大幅に低下する可能性があります。問題の数値のおおよそのスケールがわかっている場合は、絶対誤差を使用できます。

このページでは、float を比較するためのさまざまな手法について概説します。また、サブノーマル、無限大、NaN など、多くの重要な問題についても説明します。読みごたえ抜群ですので、ぜひ最後まで読んでいただきたいです。

于 2008-11-30T05:22:08.373 に答える
5

別の解決策として、数値を四捨五入または切り捨ててから直接比較してみませんか? 事前に有効桁数を設定することで、その範囲内の精度を確保できます。

于 2008-11-30T06:53:42.747 に答える
1

問題は、非常に大きな数の場合、イプシロンとの比較が失敗することです。

おそらく、より良い (しかし遅い) 解決策は、除算を使用することです。例:

div(max(a, b), min(a, b)) < eps + 1

これで、「エラー」は相対的になります。

于 2008-11-30T05:52:35.943 に答える
0

ほとんどの場合、コードが値を比較するときは、何らかの質問に答えるために行っています。例えば:

  1. X の値が与えられたときに関数が何を返すかを知っていれば、Y を与えられた場合に同じものを返すと仮定できますか?

  2. 遅いが正確な関数を計算する方法がある場合、速度と引き換えにいくらかの不正確さを受け入れるつもりであり、法案に適合すると思われる候補関数をテストしたい場合、その関数からの出力は十分に近いか「正しい」と見なされる既知の正確なものに。

最初の質問に答えるには、理想的にはコードで値のビットごとの比較を行う必要がありますが、言語が 2009 年に IEEE-754 に追加された新しい演算子をサポートしていない限り、理想よりも効率的ではない可能性があります。2 番目の質問に答えるには、どの程度の精度が必要かを定義し、それに対してテストする必要があります。

テストが答えるはずの正確な質問に基づいて、アプリケーションが異なれば、絶対許容誤差と相対許容誤差の両方の要件が異なるため、近いものを等しいとみなす汎用の方法にはあまりメリットがないと思います。

于 2015-02-27T23:00:47.293 に答える