Nov
21
Вычисления с произвольной точностью BCMath
Вычисления с произвольной точностью BCMath
- Введение
- Установка и настройка
- Предопределенные константы
- BC Math Функции
- bcadd — Сложить 2 числа произвольной точности
- bccomp — Сравнение двух чисел произвольной точности
- bcdiv — Операция деления для чисел произвольной точности
- bcmod — Получает остаток от деления чисел с произвольной точностью
- bcmul — Умножение двух чисел с произвольной точностью
- bcpow — Возведение в степень чисел с произвольной точностью
- bcpowmod — Возводит одно число в степень другого и возвращает остаток от деления
результата на третье число
- bcscale — Задает количество чисел после десятичной точки по умолчанию для всех
bc math функций.
- bcsqrt — Извлекает квадратный корень из числа с произвольной точностью
- bcsub — Вычитает одно число с произвольной точностью из другого
Коментарии
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.