为什么在Java中数字被零无限除?

为什么在Java中数字被零无限除?,java,floating-point,double,divide-by-zero,Java,Floating Point,Double,Divide By Zero,为什么要使用Java编写以下代码 System.out.println(new Integer(1)/ new Double(0)); 打印“无限”而不是未定义。这在数学上不是错误的吗?不,在数学上不能被零除,但在Java中,无穷大对于新整数(1)/新双精度(0)是正确的新整数(0)/新双精度(0)将是未定义的(NaN) Java遵循IEEE标准,因此对于这样的浮点操作,Infinity是正确的。如果它是1/0,就会发生算术异常,因为在整数除法中,不允许被零除;无穷大没有int表示 具体而言,

为什么要使用Java编写以下代码

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

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

不,在数学上不能被零除,但在Java中,
无穷大对于
新整数(1)/新双精度(0)
是正确的<代码>新整数(0)/新双精度(0)
将是未定义的(
NaN

Java遵循IEEE标准,因此对于这样的浮点操作,
Infinity
是正确的。如果它是
1/0
,就会发生
算术异常
,因为在整数除法中,不允许被零除;无穷大没有
int
表示

具体而言,在:

[一] 如果整数除法中除数的值为0,则 引发算术异常

浮点除法的结果由 IEEE 754算法:

零除以零的结果为NaN 将非零有限值除以零,得到有符号无穷大


简言之:浮点数可以表示无穷大(甚至是产生非数字值的运算),因此产生无穷大的运算(例如除以0)是有效的。

这与浮点数上的,Java紧随其后。

在当今浮点标准的设计中,一个更好的设计决策是允许类似于零的除法产生一个特殊的哨兵值,该值指示某些内容超出了范围,而不是使程序崩溃。然后,使用结果的代码可以决定这样一个哨兵值在多大程度上表示主要问题或次要问题。例如,一个正在绘制函数图的程序可能会在绘制其余函数图时忽略无法计算某个值的点

浮点数很少作为其真值输出。相反,它将输出为足以识别其值的字符串。非零数字除以零时生成的哨兵值打印为“无穷大”,但这并不意味着它在数学上是无穷大。相反,这意味着它是一个哨兵值,用于表示一个结果,该结果与任何其他大于大约2^1024的数字都无法区分,并且应该比任何其他定义的结果排名更高。对于一个结果存在另一个sentinel值,该值与小于-(2^1024)的任何其他数字都无法区分,并且排名应该小于任何其他定义的结果。第三种是无法计算但不适合任何一种类别的结果


对于超过2^1024的计算和正数除零使用同一个哨兵的原因是,当一个非常大的正数除以一个非常小的正数时,这两种情况都会出现。如果这种比较的结果是“正无穷大”,排序高于一切,即使除以最无穷小的正数,也应在除以该数的“一半”(四舍五入为零)时保持不变。

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

其他系统至少包含一个无穷大。例如,请参见。它确实允许被零除

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

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

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


使用浮点时,许多最严重的错误都是基于假定浮点数是实数,而不是有效但不同的系统。

浮点在数学上是错误的。:)这个编译吗?包装上的运算符未定义。@braindead有趣的事实:
(a+b)+c
!=<代码>a+(b+c)用于浮点:@你也可以选择一个足够大的
(a+1)=a
。这甚至不包括在NaN中。1/0等于无穷大在数学上是不正确的。你不能被零除,数学在算术上也不能区分实数和有理数。直觉的一种方法是浮点是近似值。因此,
1.0/0.0
可以被认为是“一个非常接近1的数字,除以一个非常接近0的数字。”结果是“一个非常大的数字”,近似为
无穷大。这一切都是非常模糊和不精确的,但它得到了直觉。请注意,
1/Double.MIN_值
也是
Infinity
Double.MIN_值
Double
所能代表的最小正数。)@Rapptz是的,你说得对,我想我打字太快了。更正。@yshavit这是一个非常危险的直觉,因为理解IEEE 754浮点的其他方面的关键是浮点数不是“近似值”,它们准确地表示特定的值。这是一个非常重要的概念,这位浮点专家在向非专家密集型浮点用户解释时,不厌其烦地将您的误解列为“常见误解(2)”,将真相列为“FP数只代表它自己(理性)”。通常最好将
/
视为