双精度 - 最大值

Double precision - Max value

我有一个关于双精度的非常愚蠢的问题。我读过一个双精度数(例如在 C 中)用 64 位表示,但我也读过一个双精度数可以表示的最大值大约是 10^308。 10^308如何只用64位表示?

它不会保存10^308数的308位。双精度数包含指数和有限位数。

有关内存中浮点编码的详细说明,请参阅 https://en.wikipedia.org/wiki/IEEE_floating_point (english) http://fr.wikipedia.org/wiki/IEEE_754(法语)。

根据C标准,浮点数类型分为floatdoublelong double三种,所有floating-point类型的值表示都是实现定义

然而,大多数编译器都遵循 IEEE 754 标准指定的 binary64 格式。

此格式有:

  • 1 个符号位
  • 11 位指数
  • 52 位尾数

要找到double可以容纳的最大值,您应该检查header <float.h>中定义的DBL_MAX。对于使用 binary64 IEEE 754 标准的实现,它将约为 1.8 × 10308

64 位浮点 IEEE 数的位模式中有一个指数。在 Python 中,我计算了以下内容:

>>> import numpy as np
>>> 2**(-52) == np.finfo(np.float64).eps
True
>>> np.finfo(np.float64).max
1.7976931348623157e+308
>>> (2-2**(-52)) * 2**(2**10-1)
1.7976931348623157e+308
>>> (2-2**(-52)) * 2**(2**10-1) == np.finfo(np.float64).max
True

所以比10^308多了一点。 “2**(2**10-1)”是指数部分。另见 https://en.wikipedia.org/wiki/Double-precision_floating-point_format