请注意,如果 PHP 编译的 C 库没有内置支持 log1p() 函数,则此函数在小参数值方面的优势将会丧失。
在这种情况下,log1p() 将使用 log() 进行编译,结果的精度将与 log(1) 相同,也就是说,对于小数字,结果将始终为 0。
示例 log1p(1.0e-20)
- 如果 log1p() 用 log() 近似,则返回 0.0
- 如果底层 C 库支持 log1p(),则返回接近 1.0e-20 的值。
在任何平台上正确支持 log1p() 的一种方法,以便尊重预期结果的大小
function log1p($x) {
return ($x>-1.0e-8 && $x<1.0e-8) ? ($x - $x*$x/2) : log(1+$x);
}
如果您想要更高的精度,您可以使用更好的有限展开,用于 x 的小正值或负值
log(1+x) = x - x^2/2 + x^3/3 - ... + (-1)^(n-1)*x^n/n + ...
(此级数之和仅在 x 的值在 [0 ... 1](包含)内收敛,上述公式中的 ^ 运算符表示指数运算符,而不是 PHP 的异或运算符)
请注意,对于小于或等于 -1 的参数,log1p() 未定义,并且 log 函数的隐式底数为 Neperian "e" 常数。