This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
Para matemáticas de precisión arbitraria, PHP ofrece BCMath,
que admite números de cualquier tamaño y precisión de hasta 2147483647 (o 0x7FFFFFFF) dígitos decimales,
si hay suficiente memoria, representados como cadenas.
Números válidos (también conocidos como bien formados) en BCMath son cadenas que coinciden con la expresión regular
/^[+-]?[0-9]*(\.[0-9]*)?$/.
Pasar valores de tipo float a una función de BCMath que espera un string como operando puede no tener el efecto deseado debido a la forma en que PHP convierte valores de tipo float a string, es decir, que el string puede estar en notación exponencial (que no es compatible con BCMath), y que, antes de PHP 8.0.0, el separador decimal dependía de la configuración regional (mientras que BCMath siempre espera un punto decimal).
<?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'); // Utiliza una coma decimal
$num2 = 1.2; // (string) 1.2 => '1,2'
echo bcsub($num1, $num2, 1); // => '0.0'
?>This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.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;
}
?>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
?>