当前位置: 首页 > 知识库问答 >
问题:

为什么在Java中数字除以零是无穷大?

阎雪峰
2023-03-14

为什么Java中的以下代码

System.out.println(new Integer(1)/ new Double(0));

打印“无穷大”而不是未定义。这在数学上不是错的吗?

共有1个答案

甄文彬
2023-03-14

在数学中,有许多不同的结构支持算术。最突出的,如自然数、整数和实数,都不包括无穷大。在这些系统中,不支持除以零。

其他系统确实包含至少一个无穷大。例如,参见真实的射影线。它确实允许除以零。

只有一种方法可以知道在一个特定的系统中什么是数学定义的或未定义的--研究那个系统。

类似地,操作是否是交换的(a op b==b op a)和/或关联的(a op(b op c)==(a op b)op c)取决于系统和操作。

IEEE 754二进制浮点是一个具有有限组元素的系统,包括两个无穷大。加法和乘法都是交换的,但不是结合的。Java实数和双数算法都是基于它的。Java语言规范是确定Java浮点算术中定义了什么或没有定义什么的唯一方法。

使用浮点的许多最糟糕的错误都是基于假设浮点数是实数,而不是一个有效但不同的系统。

 类似资料:
  • 问题内容: 为什么下面的Java代码 打印’Infinity’且未定义。这在数学上不是错吗? 问题答案: 在数学中,有许多支持算术的不同结构。最突出的数字(例如自然数,整数和实数)不包括无穷大。在那些系统中,不支持除以零。 其他系统的确包含至少一个无穷大。参见,例如,真实的投影线。它确实允许被零除。 只有一种方法可以知道在特定系统中数学定义或未定义的内容-研究该系统。 类似地,操作是可交换的(a

  • 问题内容: 为什么这段代码没有抛出?看一看: 我不知道! 问题答案: 您为什么不能自己检查一下并抛出异常(如果您要的话)。

  • 我在做一个Android计算器,除以零得到9.223372e+18。为什么不显示NaN或Crash?我认为它的结果是9.223372e+18,因为这是可能的最大的double值,因为我使用了double数据类型除以零。既然这会让用户感到困惑,我该如何绕过这个问题呢? 嗨,伙计们,谢谢你们的回复。我很感激。我在下面发布了我的代码。

  • 最近我发现,如果你把一个双精度或浮点数除以0,你会得到无穷大作为值。我把无穷大转换成每种数据类型(通过编写、等),我发现如果你把它转换成字节或短,它会给出-1的值,但是如果你把它转换成任何其他数据类型,它会给你它的最大值。我想知道为什么会发生这种情况。有人猜到了吗? 这是我用来测试它的代码。 这是控制台给我的:

  • 为什么这段代码不抛出?看一看: 我不知道!

  • 为什么无穷大比较不遵循应用于NANS的逻辑?此代码打印出三次: 但是,如果将更改为,则等于取,大于和小于比较取: 这看起来很危险。假设无穷大的值是由溢出产生的,我想更有可能的是,两个最终为无穷大的变量在完美算术中实际上并不相等。