1

计算这个值很容易:

它只是 2 的 n-1 次方,然后是负 1。n 是类型中的位数。长期以来,这被定义为 64 位。因为我们也必须使用表示负数,所以我们使用 n-1 代替 n。因为必须考虑0,所以我们减去1。所以最大值为:

MAX = 2^(n-1)-1

对于双倍来说,它是什么等效的思维过程:

Double.MAX_VALUE

成为

1.7976931348623157E308
4

4 回答 4

4

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

于 2013-09-13T12:20:20.670 回答
0

根据 IEEE 标准 754,双精度数(和浮点数)在内部表示为二进制小数,因此不能准确表示小数:

所以没有等价的计算。

于 2013-09-13T12:20:46.790 回答
0

只需看一下文档。基本上,由于可以在 64 位上表示的实数数量有限,因此MAX_VALUE计算使用不同的公式。Double有关广泛的理由,您可以查阅有关数据表示的这篇文章。

于 2013-09-13T12:33:50.360 回答
0

如果我们看一下 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
于 2013-09-13T13:07:13.627 回答