双精度 - 最大值
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标准,浮点数类型分为float
、double
、long 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
我有一个关于双精度的非常愚蠢的问题。我读过一个双精度数(例如在 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标准,浮点数类型分为float
、double
、long 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