Double和Integer的不同溢出策略。为什么?

时间:2014-05-31 12:13:17

标签: java numbers double integer-overflow double-precision

此代码

System.out.println(Double.MAX_VALUE+12345 == Double.MAX_VALUE);
System.out.println(Integer.MAX_VALUE+12345 == Integer.MAX_VALUE);

返回

true
false

请澄清这种差异。

2 个答案:

答案 0 :(得分:2)

规则是相同的,Double.MAX_VALUE是如此之大,12345大约300个数量级(10 300 次)。添加比Double.MAX_VALUE小得多的数字不会改变其值。但是,添加一个具有相同数量级的数字会产生影响:

Double.MAX_VALUE + 1E300

产生正无穷大结果,与Double.MAX_VALUEdemo

不同

答案 1 :(得分:1)

添加到最大值的行为在int和double之间以两种非常重要的方式不同:

  1. 每个int(除最大值之外)与其直接后继者之间的差异为1,无论幅度如何。连续双打之间的差异随着幅度的增加而增加。例如,Double.MAX_VALUE与下一个小于它的差值的绝对值约为2e292。 1.0和下一个小于1.0e-16的差值的绝对值约为1.1e-16。
  2. 每个32位位模式表示一个int数。对于NaN和无限值,一些64位位模式保留为double。添加一个到Integer.MAX_VALUE包裹到Integer.MIN_VALUE。添加足够大的正数以对Double.MAX_VALUE产生影响会产生Double.POSITIVE_INFINITY,由其中一个保留位模式表示。
  3. int基于2的补码二进制算法。它设计紧凑,高效,并允许非常快速的简单算术。

    double更偏向于功能性。通常,浮点运算需要多个机器周期。它可以保留需要特殊处理的保留位模式,例如无穷大。