<math.h>提供了一种用于计算log(1+x)double的更准确的方法。

是否有类似的精确方式来计算log(1-x)

我问的原因是因为我试图在日志空间中做一些工作以提高精度(我主要是对非常接近零的数字进行相乘和求和)。我发现编写使用log( exp(log_of_a) + exp(log_of_b) ) = log( a + b )给出log1p的函数很容易。我试图为差异做一个类似的功能:
log( exp(log_of_a) - exp(log_of_b) ) = log( a - b )当然是a > b

本质上,只要log_alog_b == -inf都没有,该函数应该简单地返回:

return log( 1 - exp(log_b-log_a) ) + log_a;

log_add函数中,我最终得到了log( 1 + ... ),因此我使用log1p。但是这里我有log( 1 - ... )。以防万一,我什至用谷歌搜索了log1m,但是没有运气...

当参数x[-inf, 1)范围内时,我可以简单地使用log1p(-x)(根据我的断言a > b)。

这是最好的解决方案吗?我觉得我必须做以前做过的工作...

非常感谢您的帮助,因为我知道如何获得最准确的结果(或者解释为什么我无法获得比此结果更准确的结果)。

最佳答案

@Raymond Chen很有意思:“浮点数取反是精确的,因此log1p(-x)log1p(x)一样准确。”只是使其成为一个真正的答案。

10-08 12:49