2017-07-05 4 views
1

誰でもフラグの値がFalseを返す理由を説明できますか?以下のシナリオでDouble.isNan()の値をFalseにするのはなぜですか?

double a = 1.0; 
double b = 0.0; 
double c = a/b; 
boolean flag = Double.isNaN(c); 
System.out.println(flag); // False? 
System.out.println(c); // Infinity 
+0

以前にリンクされた複製が別の質問に答えているため、このケースをカバーしていないため、これを再オープンしました。 – ajb

+1

http://javaconceptoftheday.com/isnan-and-isinfinite-methods-java/ –

+2

を参照してください。無限は「NaN」ではないからですか? – EJP

答えて

1

これは、IEEE-754規格の記載です。 0以外の浮動小数点数をゼロで除算すると、数値は返されませんが、infinityです。

はこれを見てください:http://grouper.ieee.org/groups/754/faq.html#exceptions

+0

「あなたはゼロによる浮動小数点数を分割するときゼロ以外の浮動小数点数をゼロで除算するときに "とする必要があります。 0/0はNaNを返します。 – ajb

+0

あなたは絶対に正しいです。編集されました。ありがとう! :) – Tavo

2

これは、IEEE 754規格での浮動小数点表現の定義によるものです。この規格には、「無限大」と「NaN」の両方の表現があります。 "無限大"は、無限の結果(1/0またはtan(pi/2)[*]など)を生成するか、絶対値が形式が表すことができる最大数より大きい結果を生成する操作です。より正確には、数学では、実際には無限の結果のようなものはありません。むしろ、それは限界の点で定義されています。したがって、1/0は存在しないが、xが0に近づくにつれて1/xの制限は無限である。

"不定形式"の場合はNaNが返されます。数学では、分子と分母を見るだけで限界を決めることができない0/0のような場合です。 (ある点f(a)= g(a)= 0で値が両方とも0である2つの関数f(x)とg(x)がある場合、f(x)/ L 'Hopitalの規則のような特別な作業をすることなく、xがaに近づくにつれてg(x)を返す。NaNは、負の数の平方根を取るようなものについても返される。 Javaでは

、唯一の実際のNaNのためではなく、無限大のための真isNan戻ります。無限大は実際には「数ではありません」ですが、IEEE標準に準拠したNaNの定義には合致しません。

は操作がNaNを生成しているの定義については、hereを参照してください。

[*]は「PI」は浮動小数点数で正確に表現することができないので、これは実際にはコンピュータの「無限の結果を」作り出すことができる操作ではないことに留意されたいです。

関連する問題