为什么零1/0整数除法给错误,但浮点1 / 0.0返回“天道酬勤”?为什么零1/0整数除法给错误,但

2019-05-11 22:25发布

我只是好奇这个:

当评估1/0在Java中,会出现以下异常:

例外在线程“主” java.lang.ArithmeticException:通过在Foo.main零/(Foo.java:3)

但是1/0.0进行评估,以Infinity

public class Foo {
    public static void main (String[] args) {
        System.out.println(1/0.0);
    }
}

为什么会出现这种情况?

Answer 1:

这是因为整数没有值+/-天道酬勤,NaN和不允许除以0,而花车确实有这些特殊值。



Answer 2:

1/0是两个int类型的划分,并抛出一个异常,因为你不能整零除。 然而,0.0是文字型 ,而Java将使用浮点除法。 在IEEE浮点规范具有用于除以零(除其它东西)的特殊值,其中之一是double.Infinity。

如果你感兴趣的细节,浮点规范(通常是隐蔽)在维基百科的页面: http://en.wikipedia.org/wiki/IEEE_754-2008 ,其全文可在网上也看过: http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933 。



Answer 3:

1/0是整数除法,1 / 0.0浮点除法 - 浮标可以表示无效的值,整数不能。



Answer 4:

IEEE已经定义的某些标准的浮点数,其中包括了“非数”,正和负无穷大的定义。 这些并不适用于整数。

见http://steve.hollasch.net/cgindex/coding/ieeefloat.html

在基本舍入误差的原因,这些特殊情况。 浮点数往往总是被截断,因为他们从来都不准确。 整数,而另一方面,总是准确。



Answer 5:

fetestexceptfeenableexcept

值得注意的是,潜在的CPU硬件可以检测的特定情况下0.0 / 0.0 ,并且:

  • 设置一些标志位,其可与ANSI C查询fetestexcept(FE_ALL_EXCEPT) == FE_INVALID
  • 引发异常,如果这是与启用feenableexcept(FE_INVALID) glibc的扩展

我找不到但是如果Java的公开该功能。

下面是一个最小的可运行C的例子: 什么是安静的NaN和信号NaN的区别?



文章来源: Why does integer division by zero 1/0 give error but floating point 1/0.0 returns “Inf”?
标签: java double int