MATLAB 中的 log1p 函数

log1p function in MATLAB

提问人:Crimson 提问时间:9/11/2016 更新时间:9/11/2016 访问量:332

问:

任何人都可以帮助澄清log1p参考页面中以下句子的含义。

y = log1p(x) 计算 log(1+x),补偿 1+x 中的舍入。

我查看了源代码,但不明白重写以下函数有何帮助:

p1 = xs + 1;
careful = xs.*log(p1)./(p1-1);

这是否意味着在MATLAB中,当xs较小时,(xs+1)的舍入误差比对数函数差?

提前致谢。

MATLAB 浮动精度 对数

评论


答:

1赞 Mingjing Zhang 9/11/2016 #1

首先,for small 的舍入误差不是 MATLAB 特有的问题,而是大多数流行的计算机语言中双精度数表示方式的自然结果。IEEE 754 双精度数字只允许 ~16 位有效十进制数字。当你将两个相隔超过 16 个数量级的数字相加时,比如 和 ,结果不能全部放入一个双精度数中,并且该部分将被有效地截断,因此您将得到 .这就是舍入误差的来源。(xs + 1)xs11e-321.000...[32x]...00011e-321 + 1e-32 == 1

在您的代码片段中,当足够小时,将 ,然后将成为 。当这种情况发生时,您知道它太小而无法在常规计算过程中使用,因此我们不妨直接返回。但是,请注意,这不是 MATLAB 中的官方来源,而是其他人的经验解,旨在模仿 .xsp1=1carefulNaNxsxslog1plog1p

评论

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