private static function innerLog10($value, $in_scale, $out_scale)
{
$value_len = strlen($value);
$cmp = bccomp($value, '1', $in_scale);
switch ($cmp) {
case 1:
$value_log10_approx = $value_len - ($in_scale > 0 ? $in_scale + 2 : 1);
return bcadd($value_log10_approx, log10(bcdiv($value, bcpow('10', $value_log10_approx), min($value_len, $out_scale))), $out_scale);
case -1:
preg_match('/^0*\\.(0*)[1-9][0-9]*$/', $value, $captures);
$value_log10_approx = -strlen($captures[1]) - 1;
return bcadd($value_log10_approx, log10(bcmul($value, bcpow('10', -$value_log10_approx), $in_scale + $value_log10_approx)), $out_scale);
default:
// case 0:
return '0';
}
}