3
double d=1/0.0;
    System.out.println(d);

それは印刷されますInfinityが、それを書き込んdouble d=1/0;で印刷すると、この例外が発生Exception in thread "main" java.lang.ArithmeticException: / by zero at D.main(D.java:3)します。Javaは、ある場合にゼロによるダイビングが無限大であることを知っているのに、int0では定義されていないのはなぜですか。どちらの場合もdは倍であり、どちらの場合も結果は無限大です。

4

2 に答える 2

14

浮動小数点データ型には、無限大を表すために予約された特別な値がありますが、整数値にはありません。

あなたのコード1/0には、もちろん失敗する整数除算があります。ただし、1/0.0は浮動小数点除算であるため、結果はになりInfinityます。

于 2011-09-10T17:15:58.203 に答える
1

厳密に言えば、1.0/0.0無限ではなく、未定義です。

デビッドが彼の答えで言っているように、フロートはそれが表すことができる最大の数と最小の数の範囲にない数を表現する方法を持っています。これらの値は、まとめて「数値ではない」または単にNaNと呼ばれます。NaNは、実際には無限大の計算(など)、有限であるがフロートが表すことができる範囲をオーバーフローする値(10 100 100など)、および1/0などの未定義の値からも発生する可能性があります。limx -> 0 ln2 x

浮動小数点数は、未定義の値、オーバーフロー、および無限大を明確に区別しません。その計算から得られるビットの組み合わせは異なります。「NaN」または「NotaNumber」を出力するだけでは、浮動小数点値がどのように表されるかを知らない人にとっては少し理解しにくいため、そのフォーマッターは「Infinity」または場合によっては「-Infinity」を出力します。 FP NaNが何であるかを知っているときの情報のレベル、および知らないときは何らかの意味があります。

整数には、浮動小数点NaNに匹敵するものはありません。1/0を実行するときに整数が取る意味のある値がないため、残っている唯一のオプションは例外を発生させることです。

機械語で記述された同じコードは、Java例外に相当する割り込みを呼び出すか、最後の計算がゼロ除算であることを示すグローバル値となる条件レジスタを設定することができます。利用可能なものは、プラットフォームによって少し異なります。

于 2011-09-10T17:30:28.023 に答える