为什么';t整数在Java中表示NaN?

为什么';t整数在Java中表示NaN?,java,integer,double,nan,Java,Integer,Double,Nan,当我写这样的东西时 double a = 0.0; double b = 0.0; double c = a/b; 结果是Double.NaN,但是当我尝试对整数执行相同的操作时,它会产生一个算术异常。那么,为什么没有整数.NaN?原因与任何其他语言中都没有整数NaN相同 现代计算机对整数使用2的补码二进制表示法,而这种表示法没有NaN值。(表示类型域中的所有值都表示定整数。) 因此,计算机整数算术硬件不识别任何NaN表示 理论上,有人可以发明一种包含NaN(或INF,或其他奇异值)的整数替代

当我写这样的东西时

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

结果是
Double.NaN
,但是当我尝试对整数执行相同的操作时,它会产生一个
算术异常。那么,为什么没有整数.NaN

原因与任何其他语言中都没有整数
NaN
相同

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

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

理论上,有人可以发明一种包含NaN(或INF,或其他奇异值)的整数替代表示法。然而,硬件不支持使用这种表示的算术。虽然在软件中实现它是可能的,但它的成本会高得令人望而却步。。。在Java语言中包含这种支持在其他方面也是不可取的

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


相比之下:

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

如其他评论所述,这主要是因为NaN是浮点数的标准值。您可以在此处阅读维基百科返回NaN的原因:


请注意,整数(除以零)只有一个原因。浮点数也有一个正无穷大值和一个负无穷大值,整数没有,并且在浮点规范中与NaN紧密相连。

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

因为浮点规范指定了
NaN
值,一致性实现必须以正确的方式处理。整数实现没有,也没有办法显式地说“无效值”,这可能与查看您的问题历史记录重复,我已经用Java作为编程语言标记了您的问题。如果你说的是另一种语言,那么请这样标记。我不同意“昂贵得令人望而却步”——这是一个相对的术语,它可能比围绕这个问题编写代码的成本要便宜。不受欢迎——也许不知道。我想说的是,如果double存在这个概念,那么它可能对int有用。只是因为int的底层实现没有提供它,所以它没有完成,这实际上意味着,由于double的内部表示和范围确实允许它,因此需要一个不同的实现来存在是一个好主意。@Bohemian-我们正在讨论的是,使NaN整数成为“语言”的一部分成本过高。显然,如果一个应用程序真的需要NAN,它对它们来说并不昂贵。但大多数人不知道。是的,我知道你的意思。但这种“费用”(除了改变语言的努力,这不会影响美国程序员)最终会转化为处理INT时更高的CPU使用率,我比较的是额外功能的“成本”(也可以转换为美元)。它是否“禁止”取决于这些美元成本。事实上,我非常怀疑它是否“禁止”——我们谈论的是改变,或者更确切地说是增加基础实现,这应该被“隐藏”起来,@Bohemian——这只是成本之一。其他包括增加表示整数的空间(或减少有效值空间的大小)、更改代码、为“Java慢”团队提供更多素材。。。除此之外,所有Java程序的速度降低10%确实意味着巨大的美元成本。。。在购买更多的套件、更大的数据中心电费等方面,我们可以在全球范围内谈论数十亿美元。这个答案夸大了它的理由。对整数表示使用2的补码并不排除将其中一个值用作NaN。使用极端负值将恢复整数类型的良好对称性(它们将在求反时闭合)。非NaN整数格式优于其他格式的原因更多地是由于理想的特性,如方便的模/包装,而不是实现成本(尽管这个答案存在偏见,但这可能会转移到硬件而不是软件中)。琐事(l?:int i=(int)Float.NaN;//0