繁体   English   中英

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

[英]different overflow policy for Double and Integer. why?

这段代码

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个数量级(10 300倍)。 添加比Double.MAX_VALUE小得多的数字不会更改其值。 但是,添加一个具有相同数量级的数字会产生影响:

Double.MAX_VALUE + 1E300

产生正无穷大结果,与Double.MAX_VALUE演示 )不同

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

  1. 每个int(除最大值之外)与其直接后继者之间的差异为1,无论其大小如何。 连续双打之间的差异随着幅度的增加而增加。 例如, Double.MAX_VALUE与下一个小于它的差值的绝对值约为2e292。 1.0和下一个小于它的差值的绝对值约为1.1e-16。
  2. 每个32位位模式代表一个int数。 对于NaN和无限值,一些64位位模式保留为double。 Integer.MAX_VALUE添加一个包装到Integer.MIN_VALUE 添加足够大的正数以使Double.MAX_VALUE产生差异会导致Double.POSITIVE_INFINITY ,由其中一个保留位模式表示。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM