零除法:整数 vs. 浮点数
把一个整数除以零会出错,程序会抛出一个异常,但如果是浮点数(小数)就不会出错——至少在Java里是这样。那为什么浮点数会有额外的“NaN”信息,而整数类型却没有呢?
6 个回答
2
整数和浮点数在计算机内部的表示方式是不同的。整数通常使用一种叫做“有符号的二进制补码”的方式,这种方式其实就是把数字用二进制写出来。而浮点数则使用一种更复杂的表示方法,这种方法可以表示更大或更小的数值。不过,计算机为浮点数保留了一些特殊的位模式,用来表示一些不是数字的东西。例如,有表示“不是一个数字”(NaN)和正负无穷的值。这就意味着,如果你用浮点数去除以零,计算机会有一组特定的位来表示你是除以了零。相对而言,整数的所有位模式都是用来表示数字的,所以计算机没有办法用某种位模式来表示这个错误。
不过,这并不是整数的一个必然特性。理论上,你可以设计一种整数表示方法,让它在除以零的时候返回某种NaN的变体。只不过在实际操作中,通常并不是这样做的。
3
这里有一个关于浮点数运算的清晰解释。
8
浮点数的表示方式设计得很特别,留了一些特定的位组合来存储一些特殊值,比如NaN(不是一个数字)、无穷大等。
而整数类型没有未使用的表示方式——每一种位组合都对应一个整数。这有很多好处:
- 整数类型的范围尽可能大,没有浪费的位组合。
- 整数的表示方式很简单明了,因为没有特殊情况。
- 整数的运算速度非常快,即使在很简单的处理器上也能做到。