请注意,如果 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 函数的隐含底数是奈皮尔“e”常数。