python中十进制库的精度

The precision of Decimal library in python

提问人:niorix 提问时间:10/27/2022 更新时间:10/27/2022 访问量:140

问:

Decimal 的文档页面中,我认为一旦我们使用 decimal 进行计算,它将是一个正确的结果,没有任何浮动错误。

但是当我尝试这个方程式时

from decimal import Decimal, getcontext
getcontext().prec = 250

a = Decimal('6')
b = Decimal('500000')

b = a ** b
print('prec: ' + str(getcontext().prec) + ', ', end='')
print(b.ln() / a.ln())

它给了我不同的结果!

enter image description here

我想计算以 6 为基数表示的数字,所以我的预期结果是 ,应该是 500001。但是,当我将 prec 设置为 250 时,它给了我错误的结果。我该如何解决这个问题?6**500000int(b.ln() / a.ln()) + 1

另外,如果我想输出没有科学记数法的结果(即),我该怎么办?5E+5

Python 十进制 精度

评论

2赞 user2357112 10/27/2022
decimal可调精度,而不是无限精度。它说的是“正确舍入的十进制浮点运算”,而不是“未舍入的实数算术”。
0赞 Michael Delgado 10/27/2022
提问时请不要上传文本/代码/数据/错误的图像 - 而是将其粘贴为格式化的代码块。谢谢!

答:

1赞 dranjohn 10/27/2022 #1

各州的文档:Decimal.ln()

返回操作数的自然(以 e 为底)对数。使用ROUND_HALF_EVEN舍入模式对结果进行正确的舍入。

更改精度时,会计算出数字的更多位数,然后将它们向下舍入而不是向上舍入。该数字需要四舍五入,因为它不一定在指定的精度范围内,甚至根本不是合理的。

有关以科学记数法输出结果的信息,请参阅此问题

2赞 ti7 10/27/2022 #2

如果您追求非常精确或符号化的数学和/或被 IEEE 754 浮点混叠咬伤,请查看 SymPy

>>> from sympy import log, N
>>> expr = log(6**50000) / log(6)
>>> N(expr)
50000.0000000000
2赞 Mehmaam 10/27/2022 #3

文档清楚地显示了以下参数getcontext()

enter image description here

当你简单地执行它时,它可以显示它的内置参数。getcontext()

Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

当您可以更改时,它只能覆盖值。getcontext().prec = 250prec

enter image description here

能影响结果最主要的是,它是内置的参数。我想将其更改为,但它可能会显示错误。rounding parameter right after the precrounding=ROUND_HALF_EVENNone

enter image description here

因此,它可以澄清,无论我们能做什么,它都必须因为参数而略有变化。rounding

注意:您的结果也可能因其他内置参数而受到影响。