double d=1/0.0 vs double d=1/0

3
double d=1/0.0;
    System.out.println(d);

这段代码打印出Infinity,但是如果我们写double d=1/0;并将其打印出来,我们会得到这个异常:Exception in thread "main" java.lang.ArithmeticException: / by zero at D.main(D.java:3)为什么在一个情况下Java知道除以零是无限大,而对于整数0它没有定义呢? 在两种情况下,d都是double类型,结果都是无限大。

2个回答

14

浮点数数据类型有一个特殊值用于表示无穷大,而整数值则没有。

在您的代码中,1/0 是整数除法,显然是无法完成的。然而,1/0.0 是浮点除法,因此结果为 Infinity


1
一旦您将隐式转换变为显式,double d=1/0 就等同于 double d=(double) (1/0),而 double d=1/0.0 则等同于 double d=((double) 1)/0.0d - Mike Samuel

1

严格来讲,1.0/0.0并不是无穷大,而是未定义的。

如David在他的回答中所说,浮点数有一种表达范围超出其最高和最低可表示数字的方式。这些值被统称为“非数字(NaN)”,或者只是NaNs。NaNs也可以从实际上是无限的计算(例如limx->0 ln2 x),超出浮点数表示范围但是仍然有限的值(如10100100),以及未定义的值,如1/0。

浮点数对未定义的值、溢出和无穷大并没有明确的区分;由于那个计算结果的比特位组合取决于情况。由于仅打印“NaN”或“Not a Number”对于那些不知道浮点值如何表示的人来说更难理解,该格式化程序只会打印“Infinity”,有时是“-Infinity”。因为当您了解FP NaN的全部内容时,它提供了相同的信息水平,并且在您不了解时具有一定的意义。

整数没有与浮点NaN相似的东西。由于当你做1/0时,整数没有合理的取值选项,唯一的选择是引发异常。

用机器语言编写的相同代码可以调用中断(类似于Java异常)或设置条件寄存器,这将是一个全局值,表示最后一次计算是除以零。可用的选项因平台而异。


在Java中,1.0/0.0被定义为等于无穷大。我不同意浮点数单元不区分无穷大和NaN的说法。Sqrt(-1.0)是NaN,但溢出会导致无穷大。你是否断言格式化程序在NaN时输出无穷大? - David Heffernan
嗯...我承认我不太了解Java。如果你所说的是真的,即1.0/0.0是无穷大,那么我不得不说Java是错误的 - SingleNegationElimination
2
我有一种感觉,1.0/0.0=Infinity是IEEE754的一部分,但你为什么说它是错误的? - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接