This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
For arbitrary precision mathematics PHP offers BCMath which
supports numbers of any size and precision up to 2147483647 (or 0x7FFFFFFF) decimal digits,
if there is sufficient memory, represented as strings.
Valid (aka. well-formed) BCMath numbers are strings which match the regular expression
/^[+-]?[0-9]*(\.[0-9]*)?$/.
Passing values of type float to a BCMath function which expects a string as operand may not have the desired effect due to the way PHP converts float values to string, namely that the string may be in exponential notation (which is not supported by BCMath), and that, prior to PHP 8.0.0, the decimal separator is locale dependent (while BCMath always expects a decimal point).
<?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'); // uses a decimal comma
$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
?>