提问人:niorix 提问时间:10/27/2022 更新时间:10/27/2022 访问量:140
python中十进制库的精度
The precision of Decimal library in python
问:
在 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())
它给了我不同的结果!
我想计算以 6 为基数表示的数字,所以我的预期结果是 ,应该是 500001。但是,当我将 prec 设置为 250 时,它给了我错误的结果。我该如何解决这个问题?6**500000
int(b.ln() / a.ln()) + 1
另外,如果我想输出没有科学记数法的结果(即),我该怎么办?5E+5
答:
各州的文档:Decimal.ln()
返回操作数的自然(以 e 为底)对数。使用ROUND_HALF_EVEN舍入模式对结果进行正确的舍入。
更改精度时,会计算出数字的更多位数,然后将它们向下舍入而不是向上舍入。该数字需要四舍五入,因为它不一定在指定的精度范围内,甚至根本不是合理的。
有关以科学记数法输出结果的信息,请参阅此问题。
如果您追求非常精确或符号化的数学和/或被 IEEE 754 浮点混叠咬伤,请查看 SymPy
>>> from sympy import log, N
>>> expr = log(6**50000) / log(6)
>>> N(expr)
50000.0000000000
文档清楚地显示了以下参数getcontext()
当你简单地执行它时,它可以显示它的内置参数。getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
当您可以更改时,它只能覆盖值。getcontext().prec = 250
prec
能影响结果最主要的是,它是内置的参数。我想将其更改为,但它可能会显示错误。rounding parameter right after the prec
rounding=ROUND_HALF_EVEN
None
因此,它可以澄清,无论我们能做什么,它都必须因为参数而略有变化。rounding
注意:您的结果也可能因其他内置参数而受到影响。
上一个:C++ 128 位固定十进制库
下一个:小数点后 16 位的数字管理
评论
decimal
是可调精度,而不是无限精度。它说的是“正确舍入的十进制浮点运算”,而不是“未舍入的实数算术”。