计算这个值很容易:
它只是 2 的 n-1 次方,然后是负 1。n 是类型中的位数。长期以来,这被定义为 64 位。因为我们也必须使用表示负数,所以我们使用 n-1 代替 n。因为必须考虑0,所以我们减去1。所以最大值为:
MAX = 2^(n-1)-1
对于双倍来说,它是什么等效的思维过程:
Double.MAX_VALUE
成为
1.7976931348623157E308
计算这个值很容易:
它只是 2 的 n-1 次方,然后是负 1。n 是类型中的位数。长期以来,这被定义为 64 位。因为我们也必须使用表示负数,所以我们使用 n-1 代替 n。因为必须考虑0,所以我们减去1。所以最大值为:
MAX = 2^(n-1)-1
对于双倍来说,它是什么等效的思维过程:
Double.MAX_VALUE
成为
1.7976931348623157E308
a 的最大有限值以double
十六进制格式,0x1.fffffffffffffp1023
表示刚好低于 2 的数字(十六进制表示法中的 1.ff...)乘以 2 1023的乘积。以这种方式编写时,很容易看出它由最大可能的有效数字和最大可能的指数组成,其方式与您在问题中构建最大可能的方式非常相似long
。
如果你想要一个所有数字都用十进制表示的公式,这里有一个:
Double.MAX_VALUE = (2 - 1/2 52 ) * 2 1023
或者,如果您更喜欢一个明确表示Double.MAX_VALUE
整数的公式:
Double.MAX_VALUE = 2 1024 - 2 971
根据 IEEE 标准 754,双精度数(和浮点数)在内部表示为二进制小数,因此不能准确表示小数:
所以没有等价的计算。
如果我们看一下 Oracle 提供的表示:
0x1.fffffffffffffp1023
或者
(2-2^-52)·2^1023
我们可以看到
fffffffffffff
是 13 个十六进制数字,可以表示为 52 个二进制数字 ( 13 * 4 )。
如果每个都按原样设置为 1 ( F = 1111 ),我们将获得最大小数部分。
小数部分始终为 52 位,定义为
http://en.wikipedia.org/wiki/Double-precision_floating-point_format
1 位用于符号
剩下的 11 位构成指数。
因为指数必须是正数和负数并且它必须代表 0,它可以有一个最大值:
2^10 - 1
或者
1023