Funções matemáticas de precisão arbitrária

Introdução

Para matemática de precisão arbitrária, o PHP oferece BCMath, que suporta números de qualquer tamanho e com precisão de até 2147483647 (ou 0x7FFFFFFF) dígitos decimais, até a memória disponível, representadas como strings.

Numéros válido (ou bem formados) são strings que concordam com a expressão regular /^[+-]?[0-9]*(\.[0-9]*)?$/.

Cuidado

Passar valores de tipo float para uma função BCMatch, que espera um operando string pode não funcionar como esperado dado que o PHP converte valores float para string, especificamente que a string convertida pode estar numa notação exponencial (que não é suportado no BCMath), e dado que, anteriormente ao PHP 8.0.0, o separador decimal depende da locale configurada (enquanto BCMath sempre trabalho com ponto).

<?php
$num1
= 0; // (string) 0 => '0'
$num2 = -0.000005; // (string) -0.000005 => '-5.05E-6'
echo bcadd($num1, $num2, 6); // => '0.000000'

setlocale(LC_NUMERIC, 'de_DE'); // usa uma vírgula como separador de decimais
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>
adicionar nota

Notas de Usuários 3 notes

up
77
Hayley Watson
10 years ago
This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
up
26
volek at adamv dot cz
11 years ago
Note that when you use implementation of factorial that ClaudiuS made, you get results even if you try to calculate factorial of number that you normally can't, e.g. 2.5, -2, etc. Here is safer implementation:
<?php
/**
 * Calculates a factorial of given number.
 * @param string|int $num
 * @throws InvalidArgumentException
 * @return string
 */
function bcfact($num)
{
    if (!filter_var($num, FILTER_VALIDATE_INT) || $num <= 0) {
        throw new InvalidArgumentException(sprintf('Argument must be natural number, "%s" given.', $num));
    }

    for ($result = '1'; $num > 0; $num--) {
        $result = bcmul($result, $num);
    }

    return $result;
}
?>
up
18
ClaudiuS
13 years ago
Needed to compute some permutations and found the BC extension great but poor on functions, so untill this gets implemented here's the factorial function:

<?php
/* BC FACTORIAL
 * n! = n * (n-1) * (n-2) .. 1 [eg. 5! = 5 * 4 * 3 * 2 * 1 = 120]
 */
function bcfact($n){
    $factorial=$n;
    while (--$n>1) $factorial=bcmul($factorial,$n);
    return $factorial;
}

print bcfact(50); 
//30414093201713378043612608166064768844377641568960512000000000000
?>
To Top