我希望计算一个非常接近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):
>>> 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发布于 2022-05-15 00:08:54
使用Numpy完成@yut23的好解决方案。如果您需要处理不适合于Numpy定义的原生类型的非常小的浮点数,或者精度超过~10位的接近1的数字,那么您可以使用十进制包。它比本机浮点慢,但它可以给您一个任意精度的。问题是它不支持自然对数。log)直接函数,因为它是基于超越欧拉数(即。e),它很难用任意的精度来计算(至少在精度很高的时候是这样)。幸运的是,您可以根据基于-10的对数和基于这一个这样的现有数字数据库计算一个预先计算的欧拉数(我想10000位数应该足够满足您的需要)。下面是一个示例:
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-14result的精度为99位(只有最后一位不正确)。
发布于 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):
>>> (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-14https://stackoverflow.com/questions/72238918
复制相似问题