Python中的不精确对数

2024-04-19 12:26:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我每天都在公司里和Python2.4一起工作。我使用了标准数学库中的通用对数函数“log”,当我输入log(2**31,2)时,它返回31.000000000000004,这让我觉得有点奇怪。

我用其他2的力量做了同样的事情,而且效果很好。我运行了log10(2**31)/log10(2),得到了31.0轮

我尝试在Python3.0.1中运行相同的原始函数,假设它在更高级的版本中被修复。

为什么会这样?Python中的数学函数是否可能有一些不准确的地方?


Tags: 函数版本log标准地方公司数学事情
3条回答

你应该读“每一个计算机科学家都应该知道的浮点运算”。

http://docs.sun.com/source/806-3568/ncg_goldberg.html

这是计算机算术所期望的。它遵循的规则,比如IEEE 754,可能与你在学校学的数学不符。

如果这个实际上很重要,请使用Python的decimal type

示例:

from decimal import Decimal, Context
ctx = Context(prec=20)
two = Decimal(2)
ctx.divide(ctx.power(two, Decimal(31)).ln(ctx), two.ln(ctx))

始终假设浮点运算中会有一些错误,并在考虑该错误的情况下检查相等性(要么是0.00001%之类的百分比值,要么是0.0000000000 1之类的固定值)。由于并非所有的十进制数都可以用二进制表示,且具有固定的位数精度,所以这种不精确性是已知的。

如果Python使用IEEE754,那么您的特殊情况就不在其中,因为31应该可以很容易地表示,即使是单精度的。然而,它有可能在计算log2231所需的许多步骤中丢失精度,原因很简单,因为它没有检测特殊情况的代码,例如两次幂的直接幂。

相关问题 更多 >