2012-01-13 22 views
2

なぜ除数アンダーフローは除数が被除数よりもはるかに小さい場合にのみ発生しますが、被除数のサイズにかかわらず分母がゼロに十分近づいても発生しませんか?丸められた結果は 結果の浮動小数点形式を用いて表現するには小さすぎる指数 を有する場合除算アンダーフロー

答えて

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) 

はインフィニティを与えます。

+0

私はまだ何かが欠けていると思います。数値を使うと、以下のことは当てはまりません。.001が範囲を超え、it = 0であると仮定すると、 1/.001 = 1/0 = 0で割る、.001/.001 = 0/0 = 0で割る、.01/.001 = .01/0 = 0で除算する。違いは何ですか? – David

+0

1/0.001 == 1000;分母が縮小するにつれて、結果はゼロではなく無限に近づく。おそらく私はその質問を誤解していますか? –

+0

私はアンダーフローの分割について何かを理解していない可能性が高いです。私はコンピュータが.001を扱うことができないと仮定しており、それを0に丸めます。 .001 = 0なので、私は1/.001を試してみると、コンピュータが.001を0と見なすので、それは1/0を分割するのと同じです(分子が何であってもエラーになります)。それは本当ですか? – David