无法理解 Python 浮点数乘法 - float64 导致错误结束,而 float32 不理解

Not able to understand Python float multiplication - float64 leads to error windup while float32 does not

提问人:plibabmurak 提问时间:12/8/2022 更新时间:12/8/2022 访问量:254

问:

我试图在 python 中演示浮点错误。对于以下代码:

import numpy as np
N = 100
a = b = np.float64(0.1)

for _ in range(N): 
  c = 3*a - 2*b 
  b = a
  a = c
print(a)

浮点误差在每次迭代中都会累积,最终输出为:

35184372088832.07

但是对于 32 位浮点数,误差不会累积。将 a 和 b 初始化为:

a = b = np.float32(0.1)

导致以下输出:

0.10000000149011612

a 和 b 在每次迭代中保持不变。由于类型转换,在后一种情况下,a、b 和 c 无论如何都会通过第三次迭代转换为 float64,但为什么没有错误累积呢?C 的等效代码是什么?

我试图用 C 复制代码,但我无法生成 a 和 b 保持不变的情况。

Python 浮点 精度

评论


答:

2赞 user2357112 12/8/2022 #1

重复周期旨在在初始计算中获取一个小的舍入误差并将其放大。但是,当您最初将 和 存储为 float32 时,将 0.1 舍入为 float32 时会发生唯一的舍入错误。计算中没有舍入误差。3*a-2*bab3*a-2*b

精确执行计算只需要比最初四舍五入的精度略高。 最初四舍五入为 float32,但计算是在 float64 数学中执行的,并且 float64 float32 具有更高的精度。初始计算中没有舍入误差,因此,后续迭代不会放大任何误差。每次迭代都会保留原始值。3*a-2*babab3*a-2*b

如果你最初四舍五入并浮点64,然后在数学中执行随后的算术运算,你会看到类似的效果。abnumpy.longdouble