为什么整数不代表Java中的NaN?

Jav*_*107 7 java double integer nan

当我写的东西像

double a = 0.0;
double b = 0.0;
double c = a/b;
Run Code Online (Sandbox Code Playgroud)

结果是Double.NaN,但是当我为整数尝试相同时,它产生一个ArithmeticException.那么,为什么不存在Integer.NaN呢?

小智 8

答案与Java几乎没有关系.无穷大或未定义的数字不是整数集的一部分,因此它们被排除在外Integer,而浮点类型表示实数和复数,因此处理这些数字时,NaN浮点类型已包含在内.


Ste*_*n C 5

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

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

因此,计算机整数算术硬件不识别任何NaN表示.

理论上,有人可以为包含NaN(或INF,或其他一些外来价值)的整数创建替代表示.但是,硬件不支持使用这种表示的算法.虽然有可能实现它的软件,这将是非常昂贵的1 ...并不可取在其他方面也包含在Java语言中这种支持.

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


相比之下:

  • 表示空间中的"未使用"值已存在
  • NaN和INF值是IEE浮点标准的一部分,并且
  • 它们(通常)由浮点运算的本机硬件实现实现