Python 中的浮点数范围

2025年4月16日 | 阅读 4 分钟

在 Python 中,浮点数范围 取决于实现和平台。Python 语言规范仅要求浮点数支持至少1e-3081e+308,精度至少为53 位

实际上,大多数现代 Python 实现都使用IEEE 754 浮点数标准,该标准提供大约1.7e-3081.7e+308的范围,精度为53 位。此范围在所有平台上都相同,并由 float 内置类型支持。

但是,需要注意的是,浮点数运算容易出现舍入误差和其他不精确源,尤其是在处理非常大或非常小的数字时。在某些情况下,这可能导致意外行为和错误。

为避免这些问题,在处理货币值或其他需要高精度的应用时,通常建议使用Decimal定点算术。Python 中的decimal 模块支持具有可配置精度的定点算术,对于这些应用是浮点数算术的一个很好的替代方案。

IEEE 754 标准定义了大多数现代编程语言(包括 Python)使用的浮点数的范围和精度。该标准定义了浮点数的两种基本格式:

  • 单精度格式

它使用32 位,提供大约7 位十进制数字的精度。

  • 双精度格式

它使用64 位,提供大约16 位十进制数字的精度。

Python 默认使用双精度浮点数,这意味着 float 值的范围大约是1.7e-3081.7e+308,精度为53 位。此范围由使用11 位可表示的最大和最小指数,以及使用52 位可表示的最大和最小有效数字(即数字的纯小数部分)决定。

浮点数算术的实际精度会受到多种因素的影响,包括数字在内存中的存储方式、运算顺序以及舍入模式的选择。在某些情况下,这可能导致细微的舍入误差和其他不精确源。

为避免这些问题,在处理非常大或非常小的数字,或需要高精度时,通常建议使用替代方法。例如:

  1. 使用定点算术十进制算术,它们提供固定的小数位数精度,并避免舍入误差。
  2. 使用任意精度库,如“mpmath”“gmpy2”,它们允许您进行非常高精度的计算并避免舍入误差。

需要注意的一个重要方面是,在 Python 中对浮点数执行算术运算时,由于浮点数算术的工作方式,您可能会遇到一些意外行为。

某些算术运算可能会导致无法使用浮点数精确表示的非常小或非常大的数字。在这些情况下,结果可能会被舍入截断,从而导致您的计算出现意外行为或不准确。

浮点数算术不是结合律的,这意味着运算的顺序会影响结果。例如,由于舍入误差和其他不精确源,(a + b) + c可能不等于a + (b + c)

浮点数算术也不是分配律的,这意味着由于舍入误差和其他不精确源,(a + b) * c可能不等于a * c + b * c。为了最大限度地减少这些问题的影响,通常建议使用 math 模块或其他数值库,这些库提供了更精确可靠地执行浮点数算术运算的函数。避免比较浮点数是否相等,而是使用容差阈值或其他方法来比较两个值之间的差值大小,这也是一个好习惯。

示例

我们以一个示例来说明浮点数算术如何在 Python 中导致意外行为。

输出

0.6000000000000001
0.6

说明

在此示例中,我们使用相同的a、bc值执行两种不同的计算。在第一个计算中,我们首先将ab相加,然后将结果加到c上。在第二个计算中,我们首先将bc相加,然后将结果加到a上。

我们可能期望两个计算产生相同的结果,因为它们使用相同的a、bc值。然而,由于浮点数算术的限制,这两个计算产生了略微不同的结果。

第一个计算产生0.6000000000000001的结果,而第二个计算产生0.6的结果。这是因为由于舍入误差和其他不精确源,第一个计算的中间结果与第二个计算的中间结果略有不同。

为避免这些问题,通常建议使用decimal 模块或其他方法来更精确可靠地执行浮点数算术运算

例如

输出

0.6
0.6

说明

在此示例中,我们使用decimal 模块1位小数的精度执行相同的计算,采用定点算术。它使我们能够避免可能影响浮点数算术的舍入误差和其他不精确源。因此,两个计算都产生了相同的结果0.6