首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用numpy.log时理解不准确的结果?

如何在使用numpy.log时理解不准确的结果?
EN

Stack Overflow用户
提问于 2022-05-14 09:28:54
回答 2查看 98关注 0票数 0

我希望计算一个非常接近1的值的自然对数,但不是精确的1。

例如,np.log(1 + 1e-22)是0,而不是某个非零值.然而,np.log(1 + 1e-13)不是零,并且计算为9.992007221625909e-14

在使用numpy函数与使用dtype作为np.longdouble定义numpy数组时,我如何理解这种精度的权衡?

在我使用的系统上浮动numpy的精度信息(v1.22.2):

代码语言:javascript
复制
>>> np.finfo(np.longdouble)
finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64)

>>> 1 + np.finfo(np.longdouble).eps
1.0000000000000002
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-15 00:08:54

使用Numpy完成@yut23的好解决方案。如果您需要处理不适合于Numpy定义的原生类型的非常小的浮点数,或者精度超过~10位的接近1的数字,那么您可以使用十进制包。它比本机浮点慢,但它可以给您一个任意精度的。问题是它不支持自然对数。log)直接函数,因为它是基于超越欧拉数(即。e),它很难用任意的精度来计算(至少在精度很高的时候是这样)。幸运的是,您可以根据基于-10的对数和基于这一个这样的现有数字数据库计算一个预先计算的欧拉数(我想10000位数应该足够满足您的需要)。下面是一个示例:

代码语言:javascript
复制
import decimal
from decimal import Decimal

decimal.setcontext(decimal.Context(prec=100)) # 100 digits of precision
e = Decimal('2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516643')
result = (Decimal("1")+Decimal("1e-13")).log10() / e.log10()

# result = 9.999999999999500000000000033333333333330833333333333533333333333316666666666668095238095237970238087E-14

result的精度为99位(只有最后一位不正确)。

票数 2
EN

Stack Overflow用户

发布于 2022-05-14 22:50:11

为了实际使用,请看一看np.log1p(x),它计算log(1 + x)而没有来自1 + x的舍入错误。从医生那里:

对于实值输入,log1p对于x也是精确的,以至于1+x == 1在浮点精度上也是精确的.

甚至log(1 + 1e-13)的工作示例也与小数点第3位的64位浮点数的真值和128位浮点数的第6位的真值不同(真值来自WolframAlpha):

代码语言:javascript
复制
>>> (1 + 1e-13) - 1
9.992007221626409e-14
>>> np.log(1 + 1e-13)
9.992007221625909e-14
>>> np.log(1 + np.array(1e-13, dtype=np.float128))
9.999997791637127032e-14
>>> np.log1p(1e-13)
9.9999999999995e-14
>>> 9.999999999999500000000000033333333333330833333333333533333*10**-14
9.9999999999995e-14
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72238918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档