提问人:plibabmurak 提问时间:12/8/2022 更新时间:12/8/2022 访问量:254
无法理解 Python 浮点数乘法 - float64 导致错误结束,而 float32 不理解
Not able to understand Python float multiplication - float64 leads to error windup while float32 does not
问:
我试图在 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 保持不变的情况。
答:
2赞
user2357112
12/8/2022
#1
重复周期旨在在初始计算中获取一个小的舍入误差并将其放大。但是,当您最初将 和 存储为 float32 时,将 0.1 舍入为 float32 时会发生唯一的舍入错误。计算中没有舍入误差。3*a-2*b
a
b
3*a-2*b
精确执行计算只需要比最初四舍五入的精度略高。 最初四舍五入为 float32,但计算是在 float64 数学中执行的,并且 float64 比 float32 具有更高的精度。初始计算中没有舍入误差,因此,后续迭代不会放大任何误差。每次迭代都会保留原始值。3*a-2*b
a
b
a
b
3*a-2*b
如果你最初四舍五入并浮点64,然后在数学中执行随后的算术运算,你会看到类似的效果。a
b
numpy.longdouble
下一个:计算三角函数需要多少次算术运算?
评论