なぜ除数アンダーフローは除数が被除数よりもはるかに小さい場合にのみ発生しますが、被除数のサイズにかかわらず分母がゼロに十分近づいても発生しませんか?丸められた結果は 結果の浮動小数点形式を用いて表現するには小さすぎる指数 を有する場合除算アンダーフロー
2
A
答えて
3
http://www.strw.leidenuniv.nl/docs/intel/f_ug/ieee_ovw.htm
からアンダーフロー例外が発生します。
これは、被除数と除数の比は、浮動小数点形式の精度ではなく、例えばイプシロンなどの特定の値の任意の依存を超えるのに十分小さいときにエラーがoccurrsことを意味します。
分母がゼロに近づくにつれて、非ゼロの分子を仮定すると、除算の結果は無限に近づくでしょう。分子がゼロに近づくにつれて、非ゼロの分母を仮定すると、結果はゼロに近づく。この値が十分に小さくなると、発生します。
分子と分母の値が非常に近い場合、それらが非常に小さい場合でも有用な結果を得ることができるため、非常に小さな分子が必ずアンダーフローを引き起こすとは限りません。
例:
C位で、イプシロンは1.401298E-45です。
イプシロン/イプシロン== 1.0F
分子は非常に、非常に小さいですが、結果はまだ有効フロートです。あなたはこのような何かをしようとした場合今
、:
float max = 3.40282347E+38f;
/// underflow, denominator will be 0.0f
float denominator = epsilon/max;
denominator
は1E-83の順序があります。 83は最大単精度浮動小数点指数をはるかに超えているため、値はゼロにクランプされます。これがアンダーフローが発生する場所です。 denominator
に格納された中間結果は、第一、第二の操作で使用される前に0にクランプされているため
/// generates a divide-by-zero error.
float result = 10/denominator;
これは、ゼロによる除算の代わりに無限大を生成します。同様
10f/float.Epsilon/float.MaxValue
:あなたは再びC#で、など。例えば
アンダーフローや除算ゼロコンパイラに依存することができ、あなたの使用及びparenthisisの順序を、得るかどうか
as
(10f/float.Epsilon)/float.MaxValue
は20971522.0fです。
しかし、数学的に表現equivelant:
10f/(float.Epsilon/float.MaxValue)
はインフィニティを与えます。
関連する問題
- 1. Bluestacks - エラー:算術演算のオーバーフローまたはアンダーフロー
- 2. アンダーフロー及びオーバーフロー
- 3. 整数オーバーフロー/アンダーフロー
- 4. どのCコンパイラにポインタ減算アンダーフローがありますか?
- 5. C++のアンダーフローとオーバーフロー
- 6. HMMのフォワードアルゴリズムのアンダーフロー
- 7. Bツリーのルートのアンダーフロー
- 8. アンドロイドのリストアでアンダーフロー4.3
- 9. 除算による除算
- 10. C++のlong long int型のオーバーフロー/アンダーフロー
- 11. ゼロ除算C++での除算
- 12. 0除算による除算
- 13. 8086アセンブリシフト減算と除算
- 14. C掛け算と除算
- 15. Cの乗算と除算
- 16. カーネルモジュールの除算
- 17. "ZeroDivisionError:0除算"
- 18. スカラBigDecimal除算
- 19. 除算アルゴリズム
- 20. ゼロで除算
- 21. SQLゼロ除算
- 22. 整数除算
- 23. RuntimeWarning:除算
- 24. 算術オーバーフローとアンダーフローを防ぐ最も効果的な方法は1つだけです
- 25. のPython:除算エラー
- 26. VB.NETでの除算
- 27. ダブル値の除算
- 28. 、除算が下方
- 29. 整数の除算
- 30. ScalaFiddle 0で除算
私はまだ何かが欠けていると思います。数値を使うと、以下のことは当てはまりません。.001が範囲を超え、it = 0であると仮定すると、 1/.001 = 1/0 = 0で割る、.001/.001 = 0/0 = 0で割る、.01/.001 = .01/0 = 0で除算する。違いは何ですか? – David
1/0.001 == 1000;分母が縮小するにつれて、結果はゼロではなく無限に近づく。おそらく私はその質問を誤解していますか? –
私はアンダーフローの分割について何かを理解していない可能性が高いです。私はコンピュータが.001を扱うことができないと仮定しており、それを0に丸めます。 .001 = 0なので、私は1/.001を試してみると、コンピュータが.001を0と見なすので、それは1/0を分割するのと同じです(分子が何であってもエラーになります)。それは本当ですか? – David