9

当我写类似的东西时

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

结果是Double.NaN,但是当我对整数尝试相同的操作时,它会产生一个ArithmeticException. 那么,为什么没有Integer.NaN?

4

3 回答 3

8

答案与 Java 关系不大。无穷大或未定义的数字不是整数集的一部分,因此它们被排除在外Integer,而浮点类型表示实数以及复数,因此为了处理这些,NaN已包含在浮点类型中。

于 2013-07-14T03:43:34.700 回答
5

NaN出于同样的原因,在任何其他语言中都没有整数。

现代计算机使用 2 的补码二进制表示整数,并且该表示没有 NaN 值。(表示类型域中的所有值都表示定整数。)

因此,计算机整数算术硬件无法识别任何 NaN 表示。

理论上,有人可以为包含 NaN(或 INF,或其他一些奇异值)的整数发明一种替代表示。但是,硬件不支持使用这种表示的算术运算。虽然可以在软件中实现它,但在 Java 语言中包含这种支持会非常昂贵1 ......并且在其他方​​面也是不可取的。

1 - 这当然是相对的,但我预计 NaN 的软件实现将(至少)比硬件慢一个数量级。如果你真的,真的,需要这个,那是可以接受的。但是绝大多数整数算术代码不需要这个。在大多数情况下,为“除以零”抛出异常就可以了,并且在所有整数算术运算中减速一个数量级......是不可接受的。


相比之下:

  • 表示空间中的“未使用”值已经存在
  • NaN 和 INF 值是 IEE 浮点标准的一部分,并且
  • 它们(通常)由浮点运算的本机硬件实现实现
于 2013-07-12T13:31:06.103 回答
0

正如其他评论中所指出的,这主要是因为 NaN 是浮点数的标准值。您可以在此处阅读有关在 Wikipedia 上返回 NaN 的原因:

http://en.wikipedia.org/wiki/NaN

请注意,整数仅存在这些原因之一(除以零)。整数没有的浮点数也有正无穷大和负无穷大值,并且与浮点规范中的 NaN 密切相关。

于 2013-07-12T13:43:30.350 回答