はt
、a
、b
は全て二重(IEEE STD 754)変数であり、そしてa
、b
の両方の値がNaN
されていない(しかしInf
であってもよい)と仮定する。 t = a - b
の後には、必ずa == b + t
が必要ですか?IEEE Std 754浮動小数点:let t:= a - b、標準ではa == b + tと保証されますか?
答えて
絶対にありません。明らかなケースの1つはa=DBL_MAX
、b=-DBL_MAX
です。次にt=INFINITY
ですので、b+t
もINFINITY
です。
さらに驚くかもしれないのは、これがオーバーフローなしに発生するケースがあるということです。基本的には、それらは全てa-b
が不正確な形式のものです。例えばa
がDBL_EPSILON/4
とb
が-1
ある場合、a-b
(デフォルト丸めモードを想定)1であり、a-b+b
、私は、この第二の例を言及0
理由は、これが強制の正規方法であることですIEEE演算の特定の精度に丸めます。たとえば、範囲[0,1]の数値が4ビットの精度に丸める場合は、加算してから0x1p49
を減算します。
2番目の例は、InfもNaNも発生しないので素晴らしいです。どうもありがとう。 – updogliu
'0x1p49'定数を明確にしたい場合があります。最後に0からFまでの16進数を表示したとき) – MSalters
@MSalters:" 0x1p49 "はC標準で定義されている16進浮動小数点です。形式は "0x" 0"p"
最初の操作を実行するプロセスでは、結果の下端からビットが失われている可能性があります。だから1つの質問です、2番目の操作は、正確にそれらの損失を再現しますか?私はそれを完全には考えていない。
もちろん、最初の操作が+/-無限にオーバーフローして2番目の比較が不均等になる可能性があります。
(そして、もちろん、一般的なケースでは、浮動小数点値の==
を使用すると、ほとんど常にバグです。)
数え上げの議論だけでは、2番目の操作で失われたものを戻すことはできません。可能ならば、 't'のビット数よりも' t'に多くのビット情報を格納するでしょう... –
@R - はい。直感的には、あなたが言うことのためにうまくいかないことは分かっていますが、例を見つけることはどれほど有効であっても、秘密のルールに訴えるよりも優れています。 –
山車を使用するときは、何かを保証するものではありません。指数が両方の数値で異なる場合、算術演算の結果は浮動小数点で完全に表現できないことがあります。
は、このコードを考えてみましょう:
のVisual Studio 2010上で実行float a = 0.003f;
float b = 10000000.0f;
float t = a - b;
float x = b + t;
、あなたはt==-10000000.0f
を取得し、そのためx==0
。
浮動小数点数を比較するときは、等値を使用しないでください。代わりに、両方の値の差の絶対値と、精度の必要性に十分に小さいイプシロン値を比較します。
異なる浮動小数点の実装が同じ操作で異なる結果を返す場合があるため、それはさらに奇妙になります。
私は「違いの絶対値を比較する」アドバイスは一度も好きでした。エラーの範囲を取得することは可能です([各コンピュータ科学者が浮動小数点演算について知っておくべきこと](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)は良い盲目的に何らかの縛りに切り替える前に、比較で達成しようとしていることを考えなければならない。 –
IEEE-754フロート使用時に保証されることはたくさんあります。これはそれらの1つではありません。 –
IEEEの浮動小数点数を使用するときには多くの保証があります。平等のための比較が合理的であるだけでなく必須である場合もあります。浮動小数点数学は間違いなく難しいですが、ランダムでも悪意のあるものでもありません。浮動小数点の等価性のテストが重要であるという私のブログの例があります:https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-filatsso-test-them-all/ –
- 1. zipE :: Event t a - >イベントt b - >イベントt(a、b)
- 2. 「A」、「B」、「AまたはB」のT-SQLの数値
- 3. IEEE 754浮動小数点のデバッグ - メモリリトルエンディアンから実際の浮動数
- 4. タイプパターンの名前:R a b = Q(a - >(R a b、b))
- 5. FROM T +を選択Tをbから選択するか、SELECT a、b FROM T? H2データベース
- 6. AまたはB = BまたはA証明(自然控除)
- 7. GNU CのAからBへの擬似乱数の生成方法(A、Bはint)標準ライブラリ
- 8. X = A - inv(B)* Y * inv(B)とX = Y + A '* inv(B)* Aを計算する方法はありますか?
- 9. std :: string s =(std :: string) "a" + "b" + "c"; OK?
- 10. C#のdecimal型とIEEE-754の標準
- 11. a.compareTo(b)がcompareTo(a、b)またはa.method(b)= method(a、b)と等しいのはなぜですか?
- 12. Typeパラメーター(A、B)
- 13. double a = a + int bとint a + = double bの違いは何ですか?
- 14. Java - IEEE-754 64ビット浮動小数点をdouble精度に変換する
- 15. x = function(a、b、c){}と関数x(a、b、c){}の違いは何ですか?
- 16. IEEE 754-2008乗算のもとで保存された標準命令
- 17. ["a"、 "b"、 "c"]の "a、b、c" .split( "、")のメリットは何ですか?
- 18. a = b + aのショートカット。
- 19. numexpr.evaluate( "a + b"、out = a)
- 20. に(、(B、C))からタプルを退治(a、b、c)は、fsharp
- 21. ハスケル: `Map(a、b)c`と` Map a(Map b c) `の違いは?
- 22. a/b mod m =(a mod m)/(b mod m)ですか?
- 23. 「a <= b && b <= a && a!= b」はどのように真実になりますか?
- 24. [:] = bとa = b [:]の違いは? (Python)
- 25. 2xbelongs_to、AユニークB
- 26. '(a b c)と(a' b 'cをリストする)の違いは何ですか?
- 27. Functorは(a - > b) - >(f a - > f b)であり、(cカテゴリ)=> c a b - > c(f a)(f b)とは何か?
- 28. T-SQL小数点乗算
- 29. a = return bを返したら、a = bですか?
- 30. inc = 1の場合、BLAS daxpyとdcopyは、a:(:、t)= b(:、t)を使うよりも速いですか?
アンダーフローの結果は定義されていないと考えられ、2番目の式のオーバーフローの結果も同様です。もし誰かがそれを確認できれば、いいと思う。 – chris
ああ、浮動小数点でもオーバーフローが未定義であることを確認していると思います。 ' は他の算術オーバーフローと同じ結果にならない場合、動作は不確定です。 ' – chris
C実装IEEE 754に準拠しているため、浮動小数点演算のためのUBはありません。すべての結果は厳密に定義されています。 –