我只是好奇这个:
当评估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);
}
}
为什么会出现这种情况?
这是因为整数没有值+/-天道酬勤,NaN和不允许除以0,而花车确实有这些特殊值。
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 。
1/0是整数除法,1 / 0.0浮点除法 - 浮标可以表示无效的值,整数不能。
IEEE已经定义的某些标准的浮点数,其中包括了“非数”,正和负无穷大的定义。 这些并不适用于整数。
见http://steve.hollasch.net/cgindex/coding/ieeefloat.html
在基本舍入误差的原因,这些特殊情况。 浮点数往往总是被截断,因为他们从来都不准确。 整数,而另一方面,总是准确。
fetestexcept
和feenableexcept
值得注意的是,潜在的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”?