一尘不染

小数模块中的有效数字

python

因此,我决定尝试编写一些python脚本来解决我的问题,从而解决物理作业。我遇到的一个问题是,重要的数字似乎并不总是正确地出现。例如,这可以正确处理重要数字:

from decimal import Decimal
>>> Decimal('1.0') + Decimal('2.0')
Decimal("3.0")

但这不是:

>>> Decimal('1.00') / Decimal('3.00')
Decimal("0.3333333333333333333333333333")

有两个问题:

  1. 我对吗,这不是有效位数的期望值,还是我需要复习有效位数的数学运算?
  2. 有什么方法可以不必手动设置小数精度吗?当然,我确定我可以使用numpy来执行此操作,但是我只是想知道是否有一种方法可以出于好奇而使用十进制模块来执行此操作。

阅读 197

收藏
2021-01-20

共1个答案

一尘不染

将小数位工作精度更改为2位 不是 一个好主意,除非您绝对只打算执行一个操作。

您应始终以比重要性水平更高的精度执行计算,并且仅舍入最终结果。如果执行长序列的计算并在每一步四舍五入到有效位数,则会累积错误。十进制模块不知道任何特定的操作是长序列中的一个还是最终结果,因此它假定它的舍入不应超过必要的范围。理想情况下,它将使用无限精度,但这太昂贵了,因此Python开发人员只能使用28位数字。

获得最终结果后,可能需要量化:

>>>(Decimal('1.00')/ Decimal('3.00'))。quantize(Decimal(“ 0.001”))
小数(“ 0.333”)

您必须手动跟踪重要性。如果要进行自动重要性跟踪,则应使用间隔算法。有一些适用于Python的库,包括pyintervalmpmath(支持任意精度)。用十进制库实现区间算术也很简单,因为它支持定向舍入。

您可能还需要阅读小数算法常见问题解答:小数算法是“重要性”算术吗?

2021-01-20