This extension is an interface to the GNU implementation as a library of the Basic Calculator utility by Philip Nelson; hence the name.
Für beliebig genaue mathematische Operationen bietet PHP BCMath, das Zahlen
von beliebiger Länge und Genauigkeit mit bis zu
2147483647 (oder 0x7FFFFFFF)
Dezimalstellen unterstützt, falls genügend Speicherplatz vorhanden ist,
dargestellt als String.
Gültige (d. h. wohlgeformte) BCMath-Zahlen sind Strings, die auf den
regulären Ausdruck /^[+-]?[0-9]*(\.[0-9]*)?$/ passen.
Die Übergabe von Werten vom Typ float an eine BCMath-Funktion, die einen String als Operanden erwartet, funktioniert aufgrund der Art, wie PHP float-Werte in Strings konvertiert, möglicherweise nicht wie erwartet, nämlich dass der String u. U. in exponentieller Notation vorliegt (was von BCMath nicht unterstützt wird), und dass der Dezimaltrenner vor PHP 8.0.0 von der Locale abhängt (wohingegen BCMath immer einen Dezimalpunkt erwartet).
<?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'); // verwendet ein Dezimalkomma
$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
?>