2

如果我运行以下代码行,我会收到DIVIDE BY ZERO错误

1. System.out.println(5/0);

这是预期的行为。

现在我运行下面的代码行

2. System.out.println(5/0F);

这里没有DIVIDE BY ZERO错误,而是显示INFINITY

在第一行中,我将两个整数相除,在第二行中,我将两个实数相除。

为什么整数除以零会产生DIVIDE BY ZERO错误,而实数会产生错误INFINITY

我确信它不是特定于任何编程语言的。

4

2 回答 2

5

(编辑:这个问题已经改变了一点——它在某一时刻特别提到了Java。)

Java 中的整数类型没有无穷大、“非数字”值等表示 - 而 IEEE-754 浮点类型(例如floatand doubledo)。就这么简单,真的。这并不是真正的“实数”与“整数”差异 - 例如,它也BigDecimal代表实数,但也没有无穷大的表示。

编辑:为了清楚起见,这特定于语言/平台的,因为您可以创建自己的语言/平台,它的工作方式不同。但是,底层 CPU 通常以相同的方式工作 - 因此您会发现很多很多语言的行为方式都是如此。

编辑:在动机方面,请记住,特别是对于无穷大的情况,有一些方法可以在除以零的情况下达到无穷大 - 例如除以非常非常小的浮点数。在整数的情况下,显然零和一之间没有任何关系。

还要记住,使用整数(或十进制浮点类型)的情况通常不需要无穷大的概念,或者“不是数字”的结果 - 而在科学应用中(其中float/double通常更有用), “无穷大”(或至少,“一个太大而无法合理表示的数字”)仍然是一个潜在的有效结果。

于 2012-01-28T09:12:08.083 回答
0

特定于一种编程语言或一系列语言的。并非所有语言都允许在同一表达式中使用整数和浮点数。并非所有语言都有这两种类型(例如,像 JavaScript 这样的 ECMAScript 实现在外部没有整数类型的概念)。并非所有语言都有这样的语法来内联转换值。

但是,整数运算浮点运算之间存在内在差异。在整数算术中,您必须定义除以零是错误的,因为没有值可以表示结果。在浮点算术中,特别是在 IEEE-754 中定义的浮点算术中,对于无穷大的数学概念和像 NaN(不是数字)这样的元概念还有附加值(符号位、指数和尾数的组合)。

所以我们可以假设/这种编程语言中的运算符是通用的,如果两个操作数都是该语言的整数类型,它会执行整数除法;并且如果至少一个操作数是该语言的浮点类型,则它执行浮点除法,而其他操作数将隐式转换为该浮点类型以进行操作。

在实数数学中,一个数除以一个接近于零的数相当于将第一个数乘以一个绝对值非常大的数 (x / (1 / y) = x * y)。因此,除以零的结果应该(定义为)无穷大是合理的,因为会超出浮点值的精度。

实现细节可以在该编程语言的规范中找到。

于 2012-01-28T09:51:45.033 回答