log(1+x)的对应函数是log1p,那么log(1-x)的对应函数是什么?

11

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

是否有类似精确的方法可以计算log(1-x)

之所以问这个问题,是因为我正在尝试在对数空间中进行一些工作,以获得更高的精度(我主要是在非常接近零的数字上做乘法和求和)。我发现使用log1p编写一个函数,可以给出log( exp(log_of_a) + exp(log_of_b) ) = log( a + b ),非常容易。我正在尝试为差异编写类似的函数:

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)。
这是解决这个问题的最佳方法吗?我感觉自己正在做之前已经做过的工作...
我真的很感激您帮助我知道如何得到尽可能准确的结果(或解释为什么我不能得到比这更准确的结果)。

1
我猜你的意思是 log( exp(log_of_a) - exp(log_of_b) ) = log( a - b ),对吗?你有 a + b - Gabe
+1 哎呀!好发现。太晚了... - user
12
浮点数的否定是精确的,因此 log1p(-x)log1p(x) 的准确度相同。 - Raymond Chen
1个回答

18

@雷蒙德·陈说得很对:"浮点数的否定是精确的,因此log1p(-x)log1p(x)一样准确。" 只是把它变成一个真正的答案。


3
log1p(-x)实际上是一种很好的方法,但我认为这个答案有误导性,因为它听起来像是在做一个精确的说明,但实际上并不是。如果你认为它是精确的,请明确你所说的“准确”,然后阐述从“浮点数的否定是精确的”到“log1p(-x)和log1p(x)一样精确”的推断。 - Don Hatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接