除以零:int与float

将int除以零将抛出exception,但浮点数不会 – 至少在Java中。 为什么浮点数有额外的NaN信息,而int类型没有?

设计浮点数的表示使得存在一些特殊的位组合以存储特殊值,例如NaN,无穷大等。

int类型没有未使用的表示 – 每个位模式对应一个整数。 这有很多好处:

  • 整数类型的范围尽可能大 – 没有浪费位模式。
  • 整数的表示很容易理解,因为没有特殊情况。
  • 即使在非常简单的处理器上,也可以以极高的速度完成整数运算。

这里给出了关于浮点运算的清晰解释

http://www.artima.com/underthehood/floatingP.html

基本上,这是一个纯粹武断的决定。

传统的int尝试使用所有位来表示可能的数字,而IEEE 754标准为NaN保留一个特殊值。

可以更改标准以包含特殊值,但代价是操作效率较低。 开发人员通常期望int操作非常有效,而具有浮点数的操作(纯粹在心理上)允许更慢。

Java反映了大多数CPU的实现方式。 整数除以零会导致x86 / x64上的中断,浮点除以零会导致无穷大,负无穷大或NaN。 注意:浮点数也可以除以负零。 :P

我认为真正的原因,其根源是众所周知的事实:计算机将所有内容存储为零和一。

它与整数,浮点数和零除法有什么关系? 这很简单。 如果你只有零和一个,很容易将它们组合成整数,就像你用十进制数字一样。 所以“10”变为2,“11”变为3,依此类推。 这种整数表示是如此自然,没有人会想到为整数发明任何其他东西,它只会使CPU更复杂,更令人困惑。 唯一需要的“发明”是弄清楚如何存储负数,但如果从x +( – x)应始终等于零的点开始,这也是非常自然和简单的,而不使用任何特殊类型的另外这里。 这就是为什么11111111对于8位整数是-1的原因,因为如果你加1,它就变成100000000,那么第8位因溢出而被截断,你得到零。 但是这种自然格式没有无限和NaN的地方,没有人想要为此发明一种非自然的表现forms。 好吧,如果有人真的这样做,我不会感到惊讶,但是这种格式无法成为众所周知和广泛使用的。

现在,对于浮点数,没有自然的表示。 即使我们将0.5转换为二进制,它仍然会像0.1这样只有现在我们有“二进制点”而不是小数点。 但CPU不能自然地代表一个“点”,只有1和0.所以需要一些特殊的格式。 根本没有别的办法。 然后有人可能会建议,“嘿伙计们,虽然我们在这里,为什么不包括无限和其他数字废话的特殊表示?” 它完成了。

这就是为什么这些格式如此不同的原因。 如何按零处理除法,这取决于语言设计者,但对于浮点数,他们可以在inf / NaN和exception之间进行选择,而对于整数,他们自然不会有这样的事情。

Ints和浮动在机器内部表示不同。 整数通常使用带符号的二进制补码表示,它基本上是用基数2写出的数字。 另一方面,浮点数使用更复杂的表示,可以容纳更大和更小的值。 但是,机器为浮点数保留了几种特殊的位模式,以表示数字以外的其他内容。 例如,NaN的值,正的或负的无穷大。 这意味着如果将float除以零,则计算机可以使用一系列位来对您除以零进行编码。 对于int,所有位模式都用于编码数字,因此计算机无法用来表示错误的有意义的一系列位。

但这不是整数的基本属性。 从理论上讲,人们可以通过返回一些NaN变体来制作一个整数表示来处理除零。 这不是在实践中所做的。