【问题标题】:np.sum does not return exact summation [duplicate]np.sum 不返回精确的总和[重复]
【发布时间】:2020-07-18 20:39:53
【问题描述】:

考虑以下数字的 numpy 向量:

a = np.array([.1, .2, .2, .2, .2, .1])

显然,这些数字的总和为 1。但是,在计算时

b = np.sum(a)

我明白了

print (b)
0.9999999999999999

谁能解释一下为什么以及如何解决这个近似问题?

【问题讨论】:

  • 这与近似值无关(当然不是) - Python、C 和许多其他语言使用 IEE754 浮点格式,并且是一种有限精度格式,数组中没有任何数字可以准确地表示为二进制值。

标签: python numpy function-approximation


【解决方案1】:

这是由于机器浮点精度造成的。这里详细解释一下:https://docs.python.org/3/tutorial/floatingpoint.html

您可以使用以下方法修复它:

b = round(np.sum(a),5)
print(b)

【讨论】:

    【解决方案2】:

    您可以选择不同的数据类型来更改精度:

    n = 1000
    
    print(abs(1 - np.array([1 / n] * n).sum(dtype='float32')))
    print(abs(1 - np.array([1 / n] * n).sum(dtype='float64')))
    print(abs(1 - np.array([1 / n] * n).sum(dtype='float128')))
    

    将产生:

    1.1920928955078125e-07
    4.440892098500626e-16
    2.0816681711721685133e-17
    
    

    【讨论】:

    • 这只是偶然产生了预期的结果。使用 float32 实际上会使舍入误差更加严重。
    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多