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