将int除以零将抛出异常,但浮点数不会 - 至少在Java中。为什么浮点数有额外的NaN信息,而int类型没有?
答案 0 :(得分:8)
浮点数的表示形式设计为保留一些特殊的位组合来存储special values,如NaN,无穷大等。
int类型没有未使用的表示 - 每个位模式对应一个整数。这有很多好处:
答案 1 :(得分:3)
这里给出了关于浮点运算的明确说明
答案 2 :(得分:1)
基本上,这是一个纯粹武断的决定。
传统的int
尝试使用所有位来表示可能的数字,而IEEE 754标准为NaN
保留一个特殊值。
可以更改int
s的标准以包含特殊值,但代价是运营效率较低。开发人员通常期望int
操作非常有效,而浮动点数的操作(纯粹在心理上)更容易变慢。
答案 3 :(得分:1)
Java反映了大多数CPU的实现方式。整数除以零会导致x86 / x64上的中断,浮点除以零会导致无穷大,负无穷大或NaN。注意:浮点数也可以除以负零。 :P
答案 4 :(得分:1)
我认为真正的原因,其根源,众所周知的事实是:计算机将所有内容存储为零和一。
它与整数,浮点数和零除法有什么关系?这很简单。如果你只有零和一个,很容易将它们组合成整数,就像你用十进制数字一样。所以“10”变为2,“11”变为3,依此类推。这种整数表示是如此自然,没有人会想到为整数发明任何其他东西,它只会使CPU更复杂,更令人困惑。唯一需要的“发明”是弄清楚如何存储负数,但如果从x +( - x)应始终等于零的点开始,这也是非常自然和简单的,而不使用任何特殊类型的另外这里。这就是为什么11111111对于8位整数是-1的原因,因为如果你加1,它就变成100000000,那么第8位因溢出而被截断,你得到零。但是这种自然格式没有无限和NaN的地方,没有人想要为此发明一种非自然的表现形式。好吧,如果有人真的这样做,我不会感到惊讶,但是这种格式不会变得众所周知并广泛使用。
现在,对于浮点数,没有自然表示。即使我们将0.5转换为二进制,它仍然会像0.1一样只有现在我们有“二进制点”而不是小数点。但是CPU不能自然地代表一个“点”,只有1和0.所以需要一些特殊的格式。根本没有别的办法。然后有人可能会建议,“嘿伙计们,虽然我们在这里,为什么不包括无限和其他数字废话的特殊表现?”这样就完成了。
这就是为什么这些格式如此不同的原因。如何处理除以零,这取决于语言设计者,但对于浮点数,他们可以选择inf / NaN和异常,而对于整数,他们自然不会有这样的事情。
答案 5 :(得分:0)
Ints和浮动在机器内部表示不同。整数通常使用带符号的二进制补码表示,它基本上是用基数2写出的数字。另一方面,浮点数使用更复杂的表示,可以保存更大,更小的值。但是,机器为浮点数保留了几种特殊的位模式,表示除数字之外的其他内容。例如,NaN的值,正的或负的无穷大。这意味着如果将float除以零,则计算机可以使用一系列位来对您除以零进行编码。对于int,所有位模式都用于编码数字,因此计算机无法用来表示错误的有意义的一系列位。
但这不是整数的必要属性。理论上,人们可以通过返回一些NaN变体来进行整数表示,以处理除零。这不是在实践中所做的。