这就是我所拥有的
function bcln($n, $scale=10) {
$iscale = $scale+3;
$result = '0.0';
$i = 0;
do {
$pow = (1 + (2 * $i++));
$mul = bcdiv('1', $pow, $iscale);
$fraction = bcmul($mul, bcpow(bcsub($n, '1', $iscale) / bcadd($n, '1.0', $iscale), $pow, $iscale), $iscale);
$lastResult = $result;
$result = bcadd($fraction, $result, $iscale);
} while($result !== $lastResult);
return bcmul('2', $result, $scale);
}
但这需要 5.7 秒才能运行bcln(100)
(100 位自然对数,小数点后 10 位)。此外,对于更多小数位,它并不总是准确的。有更好的算法吗?
对于特定的运行,需要 573 次迭代才能确定结果。