如何克服Python中对浮点数列表求和时的精度错误?

问题描述 投票:0回答:1

在Python3中,

0.35 * 10
显示的结果与对10个数字的列表
0.35
求和的结果不同。

Python 3.8.1 (v3.8.1:1b293b6006, Dec 18 2019, 14:08:53) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.35 * 10
3.5
>>> a = [0.35 for i in range(0, 10)]
>>> sum(a)
3.5000000000000004

仅用Python3有可能克服这个精度误差吗?我的意思是不使用像 numpy 这样的库。

python math precision
1个回答
0
投票

因此,如果您正在使用

math.fsum
对象列表,则在旧版本的 Python 上可用的一种方法是使用
float
。它比
sum
慢,但相当准确,所以,例如使用 python 3.8:

(py38) jarrivillaga-mbp16-2019:~ jarrivillaga$ python
Python 3.8.18 | packaged by conda-forge | (default, Dec 23 2023, 17:23:49)
[Clang 15.0.7 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [0.35 for i in range(0, 10)]
>>> sum(a)
3.5000000000000004
>>> sum(a) == 0.35*10
False

但是,

>>> import math
>>> math.fsum(a)
3.5
>>> math.fsum(a) == 0.35*10
True

请阅读docs中的注意事项。

我相信 Numpy 也能做类似的事情。

另外,如果你可以升级到 CPython 3.12,他们实际上改进了内置的

sum
功能:

(py312) jarrivillaga-mbp16-2019:~ jarrivillaga$ python
Python 3.12.1 | packaged by conda-forge | (main, Dec 23 2023, 08:05:03) [Clang 16.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [0.35 for i in range(0, 10)]
>>> sum(a)
3.5
>>> sum(a) == 0.35*10
True
© www.soinside.com 2019 - 2024. All rights reserved.