4

这就是我所拥有的

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 次迭代才能确定结果。

4

1 回答 1

1
于 2015-10-30T17:37:17.380 回答