我需要乘以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')
有人知道解决这个问题的办法吗?在
您的结果不正确,因为decimal也有精度(decimal是定点数学),所以这里也有下溢问题:
但是:
^{pr2}$您可以通过手动设置精度(如上述示例所示)或手动计算功率来解决您的问题,例如:
可以转换为
以及后来
Decimal module documentation
为什么不用对数呢?在
您需要计算:
表示为:
^{pr2}$如果存储自然对数,非常小的正数可以很好地存储到浮点数中:
^{3}$不是存储数字本身,而是存储值的日志。在
假设您向自身添加
ln(0.0000011)
次。你得到大约-13815510.558
。与float
相比,作为float
丢失的精度更小不管你最后得到的是什么数字,你知道你的结果就是
e
的幂次。例如,RESULT = e^-13815510.558
您可以使用以下代码:
打印到控制台的消息是:
相关问题 更多 >
编程相关推荐