На странице руководства по расширениям bcmath представлено следующее:
//bcpi function with Gauss-Legendre algorithm
//by Chao Xu (Mgccl)
function bcpi($precision){
$n=0;
$limit = ceil(log($precision)/log(2))-1;
bcscale($precision+6);
$a = 1;
$b = bcdiv(1,bcsqrt(2));
$t = 1/4;
$p = 1;
while($n < $limit){
$x = bcdiv(bcadd($a,$b),2);
$y = bcsqrt(bcmul($a, $b));
$t = bcsub($t, bcmul($p,bcpow(bcsub($a,$x),2)));
$a = $x;
$b = $y;
$p = bcmul(2,$p);
++$n;
}
return bcdiv(bcpow(bcadd($a, $b),2),bcmul(4,$t),$precision);
}
echo bcpi(64);
echo "<br>3.1415926535897932384626433832795028841971693993751058209749445923";
Похоже, что ini_set ('precision', 64);не делает ничего конструктивного для обычных математических функций php (> 15), но расширение bcmath полностью игнорирует настройку.
Поэтому, чтобы работать с точностью> = 16, используйте расширение bcmath, иначе ini_set работает до 15
И ответ @ Progman о том, что правила хранения чисел с плавающей запятой / двойного числа все еще применяются - означает, что есть ограничение на 15 десятичных знаков (даже если php хранит все числа с плавающей запятой как двойные)