BCMath Arbitrary Precision Mathematics
- Введение
- Installing/Configuring
- Предопределенные константы
- BC Math Функции
- bcadd — Add two arbitrary precision numbers
- bccomp — Compare two arbitrary precision numbers
- bcdiv — Divide two arbitrary precision numbers
- bcmod — Get modulus of an arbitrary precision number
- bcmul — Multiply two arbitrary precision number
- bcpow — Raise an arbitrary precision number to another
- bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
- bcscale — Set default scale parameter for all bc math functions
- bcsqrt — Get the square root of an arbitrary precision number
- bcsub — Subtract one arbitrary precision number from another
Коментарии
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
?>
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;
}
?>
This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.