双精度和整型的溢出策略不同.为什么



此代码

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

返回
true
false

规则是一样的,只是Double.MAX_VALUE太大了,12345大约要小300个数量级(10300倍)。添加一个比Double.MAX_VALUE小得多的数字不会改变它的值。不过,添加一个相同数量级的数字会产生不同的效果:

Double.MAX_VALUE + 1E300

产生正无穷结果,这与Double.MAX_VALUE (demo)

不同。

int型和double型对最大值进行加法的行为有两个重要的区别:

  1. 除最大值外,每个int与其直接后继值的差值为1,无论大小如何。连续双打之间的差异随着量级的增加而增加。例如,Double.MAX_VALUE与下一个比它小的double之间的差的绝对值约为2e292。1.0和下一倍小于它的差的绝对值约为1.1e-16。
  2. 每个32位模式表示一个int数。一些64位模式以双精度保留给NaN和无限值。添加一个到Integer.MAX_VALUE环绕Integer.MIN_VALUE。加一个足够大的正数来改变Double.MAX_VALUE,结果是Double.POSITIVE_INFINITY,由一个保留位模式表示。

int基于2的补二进制算法。它被设计成紧凑,高效,并允许非常快速的简单运算。

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

相关内容

  • 没有找到相关文章

最新更新