<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_a
或log_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)
一样准确。”只是使其成为一个真正的答案。