为什么整数除以零1/0会给出错误,但浮点1 / 0.0会返回“Inf”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么整数除以零1/0会给出错误,但浮点1 / 0.0会返回“Inf”?相关的知识,希望对你有一定的参考价值。

我只是好奇这个:

在Java中评估1/0时,会发生以下异常:

线程“main”中的异常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);
    }
}

为什么会这样?

答案

那是因为整数没有+/- Inf,NaN的值,并且不允许除以0,而浮点数确实具有这些特殊值。

另一答案

1/0是两个整数的除法,并抛出一个异常,因为你不能除以整数零。但是,0.0是double类型的文字,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

这些特殊情况的原因基本上是舍入错误。浮点数通常总是被截断,因为它们永远不会精确。另一方面,整数总是精确的。

另一答案

fetestexceptfeenableexcept

值得注意的是,底层CPU硬件可以检测到0.0 / 0.0的具体情况,并且:

  • 设置一些标志位,可以使用ANSI C fetestexcept(FE_ALL_EXCEPT) == FE_INVALID查询
  • 如果使用feenableexcept(FE_INVALID) glibc扩展启用了异常,则引发异常

但是我无法找到Java是否公开了这个功能。

这是一个最小的可运行C示例:What is difference between quiet NaN and signaling NaN?

以上是关于为什么整数除以零1/0会给出错误,但浮点1 / 0.0会返回“Inf”?的主要内容,如果未能解决你的问题,请参考以下文章

在java中的double和float类型数据相除为啥可以除以零

为啥 C# 允许在浮点类型中将非零数除以零?

浮点除以零的行为

无法将图像加载到 QGraphicsView(浮点除以零)。识别矩形,但不会设置场景

为啥我会收到“浮点异常(核心转储)”?

BigQuery 上出现意外的“除以零:0 / 0”错误