2024-04-19 12:26:42 发布
网友
我每天都在公司里和Python2.4一起工作。我使用了标准数学库中的通用对数函数“log”,当我输入log(2**31,2)时,它返回31.000000000000004,这让我觉得有点奇怪。
我用其他2的力量做了同样的事情,而且效果很好。我运行了log10(2**31)/log10(2),得到了31.0轮
我尝试在Python3.0.1中运行相同的原始函数,假设它在更高级的版本中被修复。
为什么会这样?Python中的数学函数是否可能有一些不准确的地方?
你应该读“每一个计算机科学家都应该知道的浮点运算”。
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所需的许多步骤中丢失精度,原因很简单,因为它没有检测特殊情况的代码,例如两次幂的直接幂。
你应该读“每一个计算机科学家都应该知道的浮点运算”。
http://docs.sun.com/source/806-3568/ncg_goldberg.html
这是计算机算术所期望的。它遵循的规则,比如IEEE 754,可能与你在学校学的数学不符。
如果这个实际上很重要,请使用Python的decimal type。
示例:
始终假设浮点运算中会有一些错误,并在考虑该错误的情况下检查相等性(要么是0.00001%之类的百分比值,要么是0.0000000000 1之类的固定值)。由于并非所有的十进制数都可以用二进制表示,且具有固定的位数精度,所以这种不精确性是已知的。
如果Python使用IEEE754,那么您的特殊情况就不在其中,因为31应该可以很容易地表示,即使是单精度的。然而,它有可能在计算log2231所需的许多步骤中丢失精度,原因很简单,因为它没有检测特殊情况的代码,例如两次幂的直接幂。
相关问题 更多 >
编程相关推荐