如果我运行以下代码行,则会出现DIVIDE BY ZERO
错误
1. System.out.println(5/0);
这是预期的行为。
现在我运行以下代码行
2. System.out.println(5/0F);
此处没有DIVIDE BY ZERO
错误,而是显示INFINITY
在第一行中,我将两个整数除以后两个实数。
为什么整数除以零会导致DIVIDE BY ZERO
错误,而在实数的情况下会给出INFINITY
我确信它并不特定于任何编程语言。
答案 0 :(得分:5)
(编辑:问题已经改变了一点 - 它在某一点上特别提到了Java。)
Java中的整数类型不具有无穷大的表示,“不是数字”等等 - 而IEEE-754浮点类型如float
和{{1} }做。这真的很简单。它不是真正的“真实”与“整数”差异 - 例如,double
也代表实数,但它也没有无穷大的表示。
编辑:为了清楚起见,这个是语言/平台特定的,因为您可以创建自己的语言/平台,其工作方式不同。但是,底层CPU通常以相同的方式工作 - 因此您会发现许多语言都是这样的。
编辑:就动机而言,请记住,特别是对于无穷大的情况,有一些方法可以在没有除以零的情况下进入无穷大 - 例如划分通过一个非常非常小的浮点数。在整数的情况下,零和一个之间显然没什么。
还要记住,使用整数(或十进制浮点类型)的情况通常不需要无穷大概念或“非数字”结果 - 而在科学应用中({{1} } / BigDecimal
通常更有用),“无限”(或至少,“一个太大而无法合理表示的数字”)仍然是一个潜在有效的结果。
答案 1 :(得分:0)
此 特定于一种编程语言或一系列语言。并非所有语言都允许在同一表达式中使用整数和浮点数。并非所有语言都具有这两种类型(例如,像JavaScript这样的ECMAScript实现在外部没有整数类型的概念)。并非所有语言都具有这样的语法来转换内联值。
但是,整数算术和浮点算术之间存在内在差异。在整数运算中,必须定义除以零是一个错误,因为没有值来表示结果。在浮点运算中,特别是IEEE-754中定义的浮点运算,有无穷大的数学概念和NaN(不是数字)等元概念的附加值(符号位,指数和尾数的组合)。
所以我们可以假设这种编程语言中的/
运算符是通用的,如果两个操作数都是语言的整数类型,它就会执行整数除法。如果至少有一个操作数是该语言的浮点类型,则它执行浮点除法,而其他操作数将隐式转换为该浮点类型以用于操作。
在实数数学中,将数字除以接近零的数字相当于将第一个数字乘以绝对值非常大的数字(x /(1 / y)= x * y)。因此,除以零的结果应该(定义为)无穷大是合理的,因为将超过浮点值的精度。
实现细节可以在该编程语言的规范中找到。