【发布时间】:2019-11-09 22:50:49
【问题描述】:
我需要乘以 1e6 数量级的 0.01。预期结果为1e-100000000。显然,典型的浮点算法无法处理这个问题。
在网上做一些研究,我发现decimal library 似乎可以解决这个问题。然而,它似乎有一些限制,使其无法满足我的需求:
>>> Decimal('.01')**Decimal('1e5') # Seems to handle this
Decimal('1E-200000')
>>> Decimal('.01')**Decimal('1e5')*Decimal('1E200000') # Yeah! It works!
Decimal('1')
>>> Decimal('.01')**Decimal('1e6') # This result is strange...
Decimal('0E-1000026')
>>> Decimal('.01')**Decimal('1e6')*Decimal('0E1000026') # Wrong result
Decimal('0')
有人知道解决办法吗?
【问题讨论】:
-
您可以始终将指数保持在一个单独的 int 中,并将乘积保持在 0.5 和 1.0 之间。有很多可能性,这只是一个例子。例如,请参阅
math.frexp()。也许记录日志是最简单的事情,这在一定程度上取决于您打算如何处理结果。
标签: python math decimal underflow