提问人:Crimson 提问时间:9/11/2016 更新时间:9/11/2016 访问量:332
MATLAB 中的 log1p 函数
log1p function in MATLAB
问:
任何人都可以帮助澄清log1p参考页面中以下句子的含义。
y = log1p(x) 计算 log(1+x),补偿 1+x 中的舍入。
我查看了源代码,但不明白重写以下函数有何帮助:
p1 = xs + 1;
careful = xs.*log(p1)./(p1-1);
这是否意味着在MATLAB中,当xs较小时,(xs+1)的舍入误差比对数函数差?
提前致谢。
答:
1赞
Mingjing Zhang
9/11/2016
#1
首先,for small 的舍入误差不是 MATLAB 特有的问题,而是大多数流行的计算机语言中双精度数表示方式的自然结果。IEEE 754 双精度数字只允许 ~16 位有效十进制数字。当你将两个相隔超过 16 个数量级的数字相加时,比如 和 ,结果不能全部放入一个双精度数中,并且该部分将被有效地截断,因此您将得到 .这就是舍入误差的来源。(xs + 1)
xs
1
1e-32
1.000...[32x]...0001
1e-32
1 + 1e-32 == 1
在您的代码片段中,当足够小时,将 ,然后将成为 。当这种情况发生时,您知道它太小而无法在常规计算过程中使用,因此我们不妨直接返回。但是,请注意,这不是 MATLAB 中的官方来源,而是其他人的经验解,旨在模仿 .xs
p1
=1
careful
NaN
xs
xs
log1p
log1p
评论
0赞
Crimson
9/11/2016
谢谢你的回答。我明白如果 xs 小于或等于 10^-16,那么 1+10^-16 将被视为 IEEE 754 双精度数下的 1。但据我了解,这个实现(log1p)主要是为xs很小但1+xs != xs的情况而设计的。(定理 4 [1])。我无法理解这如何有助于在这种情况下减少错误(xs 很小,但 1+xs != xs )。[1]docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
评论