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

The*_*nor 2 java floating-point double divide-by-zero

为什么要在Java中使用以下代码

System.out.println(new Integer(1)/ new Double(0));
Run Code Online (Sandbox Code Playgroud)

打印'无限'而不是未定义.这不是数学错误吗?

Lou*_*man 8

这与Java遵循的关于浮点的IEEE 754标准一致.


rge*_*man 6

不,你不能在数学上除以零,但在Java中Infinity是正确的new Integer(1)/ new Double(0). new Integer(0)/ new Double(0)将是undefined(NaN).

Java遵循IEEE标准,因此对于诸如此类的浮点运算Infinity是正确的.如果是的话1/0,ArithmeticException就会发生,因为在整数除法中,不允许除零; int无穷无表示.

具体来说,在JLS中,第15.17.2节:

[I] f整数除法中除数的值为0,然后抛出ArithmeticException.

浮点除法的结果由IEEE 754算法的规则决定:

将零除以零导致NaN除以零的非零有限值导致有符号无穷大.

  • @yshavit这是一个非常危险的直觉,因为理解IEEE 754浮点的其他方面的关键是浮点数不是"近似",它们恰好代表特定的值.这是一个非常重要的概念,这位浮点专家不愿意将你的误解列为"常见的误解(2)",并且在向非专家密集型用户解释时,"FP号仅表示自身(理性)"的真相浮点数.http://lipforge.ens-lyon.fr/www/crlibm/documents/cern.pdf (3认同)
  • 等于无穷大的1/0在数学上不正确.你不能除以零,数学在算术时不区分实数和有理数. (2认同)

Pat*_*han 5

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

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

只有一种方法可以知道在特定系统中数学定义或未定义的内容 - 研究该系统.

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

IEEE 754二进制浮点是具有有限元素集的系统,包括两个无穷大.加法和乘法都是可交换的,但不是联想的.Java实数和双重算术都是基于它的.Java语言规范是确定Java浮点算法中定义或未定义的唯一方法.

使用浮点的许多最差错误的基础是假设浮点数是实数,而不是有效但不同的系统.