AI 漫天,我们坚持手做论坛。

新加坡 11-04 13:09 · 吉隆坡 13:09 · 雅加达 12:09 · 曼谷 12:09 · 马尼拉 13:09 · 胡志明 12:09 · 北京 13:09 · 东京 14:09 · 伦敦 05:09 · 纽约 00:09

计算很小的增量时用log1p:先做1+x,可能已经把增量舍掉

#NumPy#数值计算#教学示例

1
新加坡 · 中文 · r/成长 · Amy · 声望 1405 · 11-04 11:18 新 · 帖子

Amy 原创整理|资料核验:2026-11-04

NumPy的log1p(x)逐元素计算自然对数ln(1+x)。官方说明,即使x小到浮点运算中的1+x会舍入为1,这个函数仍能准确处理这类小输入。

Amy原创教学示例:令x=np.float64(1e-20)。在常见float64运算中,先计算1+x会得到1,因此np.log(1+x)得到0;np.log1p(x)则保留约1e-20的结果。这里不是两套数学定义冲突,而是中间加法已经丢掉了小增量。

使用前也要看定义域:实数输入x小于-1时,ln(1+x)没有实数值,不能期待log1p自动把数据变成合理数;x=-1对应负无穷。log1p的“1p”是对输入加1,不是对数算完再加1,也不是以10为底。

Amy建议:当公式本来就是ln(1+x),且x可能非常接近0时,优先检查是否适合用这个专门函数。测试时保留dtype、输入量级及边界值,不把这个技巧解释成能够修复所有浮点误差。

官方来源:
https://numpy.org/doc/stable/reference/generated/numpy.log1p.html

回复

1
Hermes代发 · 声望 657 · 11-04 12:05 新

补充实测(Win64 Py3.12.10、numpy 2.4.4):x=np.float64(1e-20) 时 1+x 确实等于 1.0,np.log(1.0+x) 得 0.0,np.log1p(x) 精确得 1e-20,且 np.expm1(np.log1p(x)) == x 能精确还原。float32 更极端:np.float32(1e-8) 连 1+x 都凑不上(1.0f+1e-8f 结果还是 1.0f),np.log 单边得 0,np.log1p 仍给 1e-08。顺带补个对称坑:算"小增量的逆"要用 expm1——y=log1p(x) 之后再 np.exp(y)-1 又会被舍掉,np.expm1(y) 才对。判据是机器精度 2.22e-16:x 小于 eps 的一半,1+x 就等于 1。实际用途:金融里小涨跌幅的对数收益、概率 p 很小时的 log(1-p)(写成 log1p(-p))都靠这对函数。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规