2012-05-29 14 views
10

tabは全て二重(IEEE STD 754)変数であり、そしてabの両方の値がNaNされていない(しかしInfであってもよい)と仮定する。 t = a - bの後には、必ずa == b + tが必要ですか?IEEE Std 754浮動小数点:let t:= a - b、標準ではa == b + tと保証されますか?

+0

アンダーフローの結果は定義されていないと考えられ、2番目の式のオーバーフローの結果も同様です。もし誰かがそれを確認できれば、いいと思う。 – chris

+0

ああ、浮動小数点でもオーバーフローが未定義であることを確認していると思います。 ' は他の算術オーバーフローと同じ結果にならない場合、動作は不確定です。 ' – chris

+3

C実装IEEE 754に準拠しているため、浮動小数点演算のためのUBはありません。すべての結果は厳密に定義されています。 –

答えて

25

絶対にありません。明らかなケースの1つはa=DBL_MAXb=-DBL_MAXです。次にt=INFINITYですので、b+tINFINITYです。

さらに驚くかもしれないのは、これがオーバーフローなしに発生するケースがあるということです。基本的には、それらは全てa-bが不正確な形式のものです。例えばaDBL_EPSILON/4b-1ある場合、a-b(デフォルト丸めモードを想定)1であり、a-b+b、私は、この第二の例を言及0

理由は、これが強制の正規方法であることですIEEE演算の特定の精度に丸めます。たとえば、範囲[0,1]の数値が4ビットの精度に丸める場合は、加算してから0x1p49を減算します。

+1

2番目の例は、InfもNaNも発生しないので素晴らしいです。どうもありがとう。 – updogliu

+1

'0x1p49'定数を明確にしたい場合があります。最後に0からFまでの16進数を表示したとき) – MSalters

+8

@MSalters:" 0x1p49 "はC標準で定義されている16進浮動小数点です。形式は "0x" 0​​"p" であり、は16進数で、任意にピリオドを含み、は任意に記号を含む10進数です。指数部の基数は2であるため、0x1p49は2 ** 49です。 0x1p-4は1/16、0x1.23p8は(1 + 2/16 + 3/256)* 2 ** 8 = 291となります。16進浮動小数点は、人間やコンパイラが変換しやすいフォーマットを提供します丸めの問題を起こさずにバイナリ浮動小数点のエンコーディングを行うことができます。 –

1

最初の操作を実行するプロセスでは、結果の下端からビットが失われている可能性があります。だから1つの質問です、2番目の操作は、正確にそれらの損失を再現しますか?私はそれを完全には考えていない。

もちろん、最初の操作が+/-無限にオーバーフローして2番目の比較が不均等になる可能性があります。

(そして、もちろん、一般的なケースでは、浮動小数点値の==を使用すると、ほとんど常にバグです。)

+1

数え上げの議論だけでは、2番目の操作で失われたものを戻すことはできません。可能ならば、 't'のビット数よりも' t'に多くのビット情報を格納するでしょう... –

+0

@R - はい。直感的には、あなたが言うことのためにうまくいかないことは分かっていますが、例を見つけることはどれほど有効であっても、秘密のルールに訴えるよりも優れています。 –

-3

山車を使用するときは、何かを保証するものではありません。指数が両方の数値で異なる場合、算術演算の結果は浮動小数点で完全に表現できないことがあります。

は、このコードを考えてみましょう:

のVisual Studio 2010上で実行
float a = 0.003f; 
float b = 10000000.0f; 
float t = a - b; 
float x = b + t; 

、あなたはt==-10000000.0fを取得し、そのためx==0

浮動小数点数を比較するときは、等値を使用しないでください。代わりに、両方の値の差の絶対値と、精度の必要性に十分に小さいイプシロン値を比較します。

異なる浮動小数点の実装が同じ操作で異なる結果を返す場合があるため、それはさらに奇妙になります。

+5

私は「違いの絶対値を比較する」アドバイスは一度も好きでした。エラーの範囲を取得することは可能です([各コンピュータ科学者が浮動小数点演算について知っておくべきこと](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)は良い盲目的に何らかの縛りに切り替える前に、比較で達成しようとしていることを考えなければならない。 –

+8

IEEE-754フロート使用時に保証されることはたくさんあります。これはそれらの1つではありません。 –

+0

IEEEの浮動小数点数を使用するときには多くの保証があります。平等のための比較が合理的であるだけでなく必須である場合もあります。浮動小数点数学は間違いなく難しいですが、ランダムでも悪意のあるものでもありません。浮動小数点の等価性のテストが重要であるという私のブログの例があります:https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-filatsso-test-them-all/ –

関連する問題