Matematika v PHP
Souhrn matematických funkcí v PHP
Zaokrouhlování, Početní funkce, Početní funkce s BCMath, Generování náhodných čísel, Převod číselných soustav, Matematické konstanty
Zaokrouhlování
Pro zaokrouhlování je nejvhodnější použít funkci round(). Má dva parametry: prvním je číslo k zaokrouhlení, druhý, nepovinný, udává na kolik číslic po desetinné čárce se číslo zaokrouhlí. Jestliže se tento parametr nezadá, číslo se zaokrouhlí podle první číslice za desetinnou čárkou.
echo round(8.4); // 8 echo round(7.6); // 8 echo round(5.1234, 2); // 5.12 echo round(4321, -3); // 4000 echo round(2.456, 2); // 2.46
Další zaokrouhlovací funkcí je ceil(). Zaokrouhlí číslo vždy nahoru – na nejbližší celé číslo, které je větší nebo stejné jako číslo v parametru.
echo ceil (8.1); // 9 echo ceil (8.8); // 9 echo ceil(-8.8); // -8
Funkce floor() zaokrouhlí číslo vždy dolů – na nejbližší celé číslo, které je menší nebo stejné jako číslo v parametru. U kladných čísel to vypadá, jako by jen odstranila desetinnou část, u záporných čísel ale ne: floor(-8.3) vrátí -9.
echo floor(8.3); // 8 echo floor(8.6); // 8 echo floor(-8.3); // -9
Pokud chcete desetinnou část jen odříznout (u kladných i záporných čísel), použijte převod na celé číslo:
echo (int) 8.6; // 8 echo (int) -8.3; // -8 echo intval(-8.3); // -8
Pozn.: Desetinné číslo se odděluje tečkou
Početní funkce
sqrt(cislo) - vrátí druhou odmocninu zadaného čísla
pow(cislo1, cislo2) - vrátí číslo vzniklé umocněním základu mocniny (první parametr) mocnitelem (druhý parametr).
sin(cislo), cos(cislo), tan(cislo) - vrátí sinus, cosinus a tangens zadaného úhlu v radiánech (úhel ve stupních na radiány převede funkce deg2rad()).
asin(cislo), acos(cislo), atan(cislo) - inverzní funkce k sinu, cosinu a tangentě
fmod(cislo1, cislo2) - vrátí zbytek po dělení dvou čísel, které jsou parametrem funkce
max(pole), min(pole) - vrátí maximální a minimální hodnotu pole zadaného v parametru.
abs(cislo) - absolutní hodnota zadaného čísla
Početní funkce s knihovnou BCMath
V PHP je knihovna BCMath, jejíž používání neobsahuje rizika spojená s používáním typu float. Tato desetinná čísla se totiž používají jako řetězce a funkce této knihovny jsou matematické operace. BCMath se stará o přesnost na počet desetinných míst, které si sami zvolíte, přesnost máte vždy zaručenou protože BCMath nepracuje s floaty ale řetězci, které sám propočítává celočíselnou aritmetikou a s floatem nemá nic společného.
Funkce BCMath jsou funkce, kde první operátor je levá strana rovnice a druhý operátor je pravá strana rovnice. Jednotlivé funkce reprezentují pak matematickou operaci a výsledkem je buď string (výsledek matematické operace), nebo celé číslo -1, 0 či 1 (výsledek porovnání funkcí bccomp).
Všechny funkce mají ještě jeden nepovinný parametr – počet desetinných míst výsledku. Pozor, BCMath přebytečná místa nezaokrouhluje, ale odřízne: bcdiv('2', '3', 2) vrátí 0.66. Jestliže chceme pro všechny funkce stejný počet desetinných míst, můžeme využít funkci bcscale(), jejímž parametrem je právě tento počet.
bcadd(cislo1, cislo2) - sčítání
bcsub(cislo1, cislo2) - odčítání
bcmul(cislo1, cislo2) - násobení
bcdiv(cislo1, cislo2) - dělení
bcsqrt(cislo) - druhá odmocnina
bcpow(zaklad, exponent) - umocnění
bccomp(cislo1, cislo2) - porovnání dvou čísel (návratové hodnoty -1,0,1)
Příklady:
var_dump(0.1 + 0.2 == 0.3); // bool(false) – nepřesnost typu float
echo bcadd('0.1', '0.2', 1); // 0.3
echo bcdiv('2', '3', 2); // 0.66
echo bccomp('1.001', '1.0001', 3); // 1
Generování náhodných čísel
K vygenerování náhodného čísla poslouží funkce rand(0,100); kde 0 = Minimální náhodné číslo! a 100 = Nejvyšší možné náhodné číslo! (Pozor: rand() bez parametrů vrací čísla od 0 do getrandmax(). Ve starších verzích PHP to na Windows bylo jen 32767, od PHP 7.1 je rand() jen jiným názvem pro mt_rand() a rozsah je všude stejný. Pro hesla, tokeny a jiné bezpečnostní účely používejte random_int().)
mt_rand(0, mt_getrandmax () ) = Generuje velmi vysoká čísla
Převod číselných soustav
decOct(číslo) - převod z desítkové do osmičkové
decHex(číslo) - převod z desítkové do šestnáctkové
decBin(číslo) - převod z desítkové do dvojkové
octDec(číslo) - převod z osmičkové do desítkové
hexDec(číslo) - převod z šestnáctkové do desítkové
binDec(číslo) - převod z dvojkové do desítkové
bin2hex(retezec) - pozor, nepřevádí dvojková čísla: každý bajt (znak) řetězce vypíše jako dvě šestnáctkové číslice. Hodí se například pro zápis náhodných bajtů – bin2hex(random_bytes(16)) vytvoří náhodný řetězec o 32 znacích.
Flexibilnější je použít funkci base_convert(cislo, soustava1, soustava2) kde cislo je číslo které chceme převádět, soustava1 je soustava z které chceme převádět a soustava2 je soustava do které chceme převádět.
Příklady:
echo decbin(10); // 1010
echo bindec('1010'); // 10
echo dechex(255); // ff
echo hexdec('ff'); // 255
echo decoct(8); // 10
echo base_convert('1010', 2, 16); // a
echo base_convert('ff', 16, 2); // 11111111
echo bin2hex('abc'); // 616263
echo bin2hex('1010'); // 31303130
Matematické konstanty
| Konstanta | Hodnota | Popis |
|---|---|---|
| M_PI | 3.14159265358979323846 | Pí |
| M_E | 2.7182818284590452354 | e |
| M_LOG2E | 1.4426950408889634074 | log_2 e |
| M_LOG10E | 0.43429448190325182765 | log_10 e |
| M_LN2 | 0.69314718055994530942 | log_e 2 |
| M_LN10 | 2.30258509299404568402 | log_e 10 |
| M_PI_2 | 1.57079632679489661923 | pi/2 |
| M_PI_4 | 0.78539816339744830962 | pi/4 |
| M_1_PI | 0.31830988618379067154 | 1/pi |
| M_2_PI | 0.63661977236758134308 | 2/pi |
| M_SQRTPI | 1.77245385090551602729 | sqrt(pi) [4.0.2] |
| M_2_SQRTPI | 1.12837916709551257390 | 2/sqrt(pi) |
| M_SQRT2 | 1.41421356237309504880 | sqrt(2) |
| M_SQRT3 | 1.73205080756887729352 | sqrt(3) [4.0.2] |
| M_SQRT1_2 | 0.70710678118654752440 | 1/sqrt(2) |
| M_LNPI | 1.14472988584940017414 | log_e(pi) [4.0.2] |
| M_EULER | 0.57721566490153286061 | Eulerova konstanta [4.0.2] |