任何人都可以帮助澄清log1p参考页面中以下句子的含义。
y = log1p(x)计算log(1 + x),补偿1 + x中的舍入。
我看source code,我不明白如何重写函数如下有帮助:
p1 = xs + 1;
careful = xs.*log(p1)./(p1-1);
在MATLAB中,当xs很小时,(xs + 1)的舍入误差比log函数差吗?
提前致谢。
答案 0 :(得分:1)
首先,小(xs + 1)
的{{1}}的舍入误差不是MATLAB特定的问题,而是大多数流行计算机语言中双精度数表示的自然结果。 IEEE 754 double number仅允许~16个有效十进制数字。如果您添加两个间隔超过16个数量级的数字,例如xs
和1
,则结果1e-32
不能全部符合双数,{{1}部分将被有效截断,因此您将获得1.000...[32x]...0001
。这就是舍入错误的来源。
在您的代码段中,当1e-32
足够小时,1 + 1e-32 == 1
将xs
,然后p1
将变为=1
。发生这种情况时,您知道careful
太小而无法在常规计算过程中使用,因此我们也可以返回NaN
。但请注意,这不是MATLAB中xs
的官方来源,而是其他人的经验解决方案,旨在模仿xs
的行为。