9

のようなものを書くとき

double a = 0.0;
double b = 0.0;
double c = a/b;

結果は ですDouble.NaNが、整数に対して同じことを試みると、 が生成されますArithmeticException。では、なぜ がないのInteger.NaNでしょうか。

4

3 に答える 3

5

NaN他の言語に整数がないのと同じ理由で。

最新のコンピューターは、整数に 2 の補数バイナリ表現を使用しますが、その表現には NaN 値がありません。(表現型のドメイン内のすべての値は、明確な整数を表します。)

したがって、コンピューターの整数演算ハードウェアは NaN 表現を認識しません。

理論的には、誰かが NaN (または INF、またはその他のエキゾチックな値) を含む整数の代替表現を発明することができます。ただし、このような表現を使用した算術演算は、ハードウェアでサポートされていません。これをソフトウェアで実装することは可能ですが、法外に費用がかかり1 ...、このサポートを Java 言語に含めることは他の点でも望ましくありません。

1 - もちろん相対的ですが、NaN のソフトウェア実装は (少なくとも) ハードウェアよりも 1 桁遅くなると予想されます。あなたが実際にこれを本当に必要としているなら、それは受け入れられるでしょう。しかし、整数算術コードの大部分はこれを必要としません。ほとんどの場合、「ゼロ除算」の例外をスローすることは問題なく、すべての整数算術演算で桁違いに遅くなることは...受け入れられません。


対照的に:

  • 表現空間の「未使用」の値はすでに存在します
  • NaN および INF 値は、IEE 浮動小数点標準の一部です。
  • それらは(通常)浮動小数点演算のネイティブハードウェア実装によって実装されます
于 2013-07-12T13:31:06.103 に答える