Lekce 19 - Matematické funkce v PHP
V minulé lekci, Tvorba knihoven v PHP, jsme se naučili tvořit vlastní knihovny.
PHP je známo svou velkou zásobou funkcí. Nalezneme zde samozřejmě i funkce matematické. Dnes si představíme ty nejdůležitější a nejpoužívanější z nich.
Funkce round()
,
ceil()
, floor()
Někdy nám při výpočtech vyjdou čísla jako 3,185643854. Ne vždy však potřebujeme takto přesné číslo, někdy se dokonce úplně obejdeme bez jeho desetinné části. A na to tu máme tři funkce.
Funkce round()
Klasické zaokrouhlování, které známe ze školních lavic:
Co je pod polovinu, zaokrouhlíme dolů, co je nad nebo rovno polovině, zaokrouhlíme nahoru.
Druhým parametrem se dá určit i přesnost, tzn. na kolik desetinných míst budeme zaokrouhlovat.
Příklad
Příklad funkce round()
:
round(5); // 5 round(5.1); // 5 round(5.4); // 5 round(5.5); // 6 round(5.8); // 6 round(5483.47621, 2); // 5483.48 round(5483.47621, -2); // 5500
U funkce round()
je i třetí parametr, kde můžeme nastavit
mód. Zde se dá nastavit „půlicí hodnota“, tzn. číslice 5
,
zda se zaokrouhlí nahoru, či dolů. Pro podrobnější pochopení těchto
módů si doporučujeme přečíst oficiální dokumentaci a nebo si je
jednoduše chvíli zkoušet a testovat. Zde je jednoduchá tabulka ukazující
rozdíly mezi těmito módy. Defaultní hodnota pro PHP je
PHP_ROUND_HALF_UP
:
Číslo | Round | PHP_ROUND_HALF_UP | PHP_ROUND_HALF_DOWN | PHP_ROUND_HALF_EVEN | PHP_ROUND_HALF_ODD |
---|---|---|---|---|---|
5 | 5 | 5 | 5 | 5 | 5 |
5.1 | 5 | 5 | 5 | 5 | 5 |
5.2 | 5 | 5 | 5 | 5 | 5 |
5.3 | 5 | 5 | 5 | 5 | 5 |
5.4 | 5 | 5 | 5 | 5 | 5 |
5.5 | 6 | 6 | 5 | 6 | 5 |
5.6 | 6 | 6 | 6 | 6 | 6 |
5.7 | 6 | 6 | 6 | 6 | 6 |
5.8 | 6 | 6 | 6 | 6 | 6 |
5.9 | 6 | 6 | 6 | 6 | 6 |
6 | 6 | 6 | 6 | 6 | 6 |
Číslo | Round | PHP_ROUND_HALF_UP | PHP_ROUND_HALF_DOWN | PHP_ROUND_HALF_EVEN | PHP_ROUND_HALF_ODD |
---|---|---|---|---|---|
-5 | -5 | -5 | -5 | -5 | -5 |
-5.1 | -5 | -5 | -5 | -5 | -5 |
-5.2 | -5 | -5 | -5 | -5 | -5 |
-5.3 | -5 | -5 | -5 | -5 | -5 |
-5.4 | -5 | -5 | -5 | -5 | -5 |
-5.5 | -6 | -6 | -5 | -6 | -5 |
-5.6 | -6 | -6 | -6 | -6 | -6 |
-5.7 | -6 | -6 | -6 | -6 | -6 |
-5.8 | -6 | -6 | -6 | -6 | -6 |
-5.9 | -6 | -6 | -6 | -6 | -6 |
-6 | -6 | -6 | -6 | -6 | -6 |
Příklad
Důležité je také upozornit na to, jak PHP zpracovává různé formáty čísel:
echo round("4,8") . "<br />"; // Fatal error: Uncaught TypeError: round(): Argument #1 ($num) must be of type int|float, string given echo round("4.8") . "<br />"; // 5, kompilátor je schopen převést datový typ echo round(4,8) . "<br />"; // 4 echo round(4.8) . "<br />"; // 5
Argumentem funkce musí být buď proměnná datového typu int
,
nebo float
. V případě, že použijeme numerický
string
, PHP ho automaticky převede na daný číselný datový
typ. Pokud však daný string
není numerický, vznikne fatální
chyba kvůli nesprávnému datovému typu. Toto může být problematické při
používání desetinné čárky či desetinné tečky. PHP je navyklé pracovat
s desetinnou tečkou, zatímco například my v Česku používáme desetinnou
čárku. Tento problém lze vyřešit pomocí funkce
number_format()
.
Funkce ceil()
a
floor()
Tyto funkce vám vždy zaokrouhlí desetinné číslo stejným směrem, bez ohledu jestli je v horní, nebo spodní polovině.
Příklad
Funkce ceil()
zaokrouhluje vždy nahoru, funkce
floor()
dolů:
ceil(4.2); // 5 ceil(4.5); // 5 ceil(4.7); // 5 floor(4.2); // 4 floor(4.5); // 4 floor(4.7); // 4
Není zde bohužel parametr na přesnost, tudíž lze funkci použít pouze na jednotky. Zde můžete vidět porovnání těchto tří funkcí v tabulce.
Číslo | Round | Ceil | Floor | Číslo | Round | Ceil | Floor |
---|---|---|---|---|---|---|---|
5 | 5 | 5 | 5 | -5 | -5 | -5 | -5 |
5.1 | 5 | 6 | 5 | -5.1 | -5 | -5 | -6 |
5.2 | 5 | 6 | 5 | -5.2 | -5 | -5 | -6 |
5.3 | 5 | 6 | 5 | -5.3 | -5 | -5 | -6 |
5.4 | 5 | 6 | 5 | -5.4 | -5 | -5 | -6 |
5.5 | 6 | 6 | 5 | -5.5 | -6 | -5 | -6 |
5.6 | 6 | 6 | 5 | -5.6 | -6 | -5 | -6 |
5.7 | 6 | 6 | 5 | -5.7 | -6 | -5 | -6 |
5.8 | 6 | 6 | 5 | -5.8 | -6 | -5 | -6 |
5.9 | 6 | 6 | 5 | -5.9 | -6 | -5 | -6 |
6 | 6 | 6 | 6 | -6 | -6 | -6 | -6 |
Goniometrické funkce
Většina z nás zná 4 goniometrické funkce: sinus, kosinus, tangens, kotangens. PHP má však funkcí s goniometrií rovnou 12, například:
sin()
= klasický sinus,asin()
= arkus sinus (inverzní funkce k sinus, možná znáte z kalkulaček jako sin−1),sinh()
= hyperbolický sinus,asinh()
= inverzní hyperbolický sinus (spojení těch dvou).
Důležité je zmínit, že parametr je v radiánech. Pokud bychom chtěli
zadávat úhel, musíme použít funkci deg2rad()
.
Hyberbolický sinus v praxi ale asi jen tak nepoužijete, i nám dlouho trvalo zjistit, oč se vlastně jedná. Funkce by měla fungovat stejně jako sinus, ale hodnoty nejsou na jednotkové kružnici, nýbrž na jednotkové hyperbole.
Příklad
Stejné zastoupení má i cosinová funkce (cos()
,
acos()
, cosh()
, acosh()
) a tangens
(tan()
, atan()
, tanh()
,
atanh()
). Navíc je zde však funkce atan2()
, která
počítá se dvěma hodnotami. Jako bychom tedy počítali arkus tangens y/x s
tím rozdílem, že funkce podle znamének vybere kvadrant. Věříme ale, že
tyto funkce opravdu jen tak nevyužijete a klasický sinus, cosinus, tangens
vám budou stačit. Mimochodem, pokud jste to ve škole zaspali, kotangens lze
udělat jako 1/tan(x)
:
echo sin(30); // -0.98803162409286 echo sin(deg2rad(30)); // 0.5 echo cos(deg2rad(123)); // -0.54463903501503 echo 1/tan(deg2rad(45)); // 1 (onen kotangens) echo sin(deg2rad(500)); // 0.64278760968654 echo atan2(deg2rad(50), deg2rad(23)); // 1.1396575860761
Funkce deg2rad()
a
rad2deg()
Zmíněný převod mezi radiány a stupni:
echo deg2rad(45); // 0.78539816339745 echo rad2deg(0.401425728); // 23.000000002367
Převod soustav
V PHP je několik funkcí na převod mezi různými soustavami. Ukažme si příklady:
echo decoct(24); // 30 (z desítkové do osmičkové) echo dechex(24); // 18 (z desítkové do šestnáctkové) echo decbin(24); // 11000 (z desítkové do dvojkové) echo bindec(101110); // 46 (z dvojkové do desítkové) echo octdec(24); // 20 (z osmičkové do desítkové) echo hexdec(24); // 36 (z šestnáctkové do desítkové)
Ovšem stačí si zapamatovat jen jednu funkci, a to
base_convert()
, kterou převedete z libovolné soustavy do další
libovolné. Třeba i trojkové:
echo base_convert("2AF36", 16, 3); //22221022210 (z šestnáctkové do trojkové)
Kontrola typu čísla
V PHP jde jednoduše podle určitých funkcí zjistit, zda je číslo
konečné, nekonečné, nebo neznámé, díky funkcím is_finite()
,
is_infinite()
a is_nan()
. Používají se často v
podmínkách, jejich návratová hodnota je boolean
.
Příklad
Funkce is_finite()
ukazuje, zda je číslo konečné:
var_dump(is_finite(log(0))); // false var_dump(is_finite(10/0)); // ERROR var_dump(is_finite(6)); // true var_dump(is_finite(9223372036854775807)); // true (PHP_INT_MAX) var_dump(is_finite(9223372036854775807+1)); // true var_dump(is_finite(8.5070591730235E+37)); // true
Funkce:
is_infinite()
vrací, zda je číslo nekonečné (lze nahradit za!is_finite()
),is_nan()
kontroluje, zda se nejedná o neznámou hodnotu.
Příklad funkce is_nan()
:
var_dump(is_nan(acos(30))); // true var_dump(is_nan(48)); // false var_dump(is_nan(10/0)); // ERROR
Další důležité matematické funkce
Dále se určitě neobejdeme bez funkcí na mocninu, odmocninu, logaritmus, minimum či maximum:
abs(x)
= vrací absolutní hodnotu,exp(x)
= exponenciální funkce,expm1(x)
= je definován jakoexp(x)-1
, opět jakási zvláštní matematická funkce,fmod(x, y)
= vrací desetinný zbytek po celočíselném dělení x/y,hypot (x, y)
= výpočet přepony u pravoúhlého trojúhelníku (Pythagorova věta),log(x, y)
= logaritmusx
o základuy
. Pokud nezadáte základ, defaultní hodnotou je konstantaM_E
->2.718281828459
),log10(x)
= logaritmus o základu10
,log1p(x)
= logaritmus(1+x)
,min(x)
amax(x)
= najde minimální nebo maximální hodnotu z pole čísel,rand(x, y)
,mt_rand(x, y)
= funkce generování čísel (mt_rand()
má vylepšený algoritmus),pow(x, y)
= mocninax
nay
,sqrt(x)
= vrací druhou odmocninux
.
Statické funkce
getrandmax()
= vrací maximální hodnotu funkcerand()
,pi
= vrací3.1415926535898
, stejné jako konstantaM_PI
.
Konstanty
PHP má i dost předdefinovaných vlastních konstant. Zde je výpis několika hlavních:
Název | Hodnota | Popis |
---|---|---|
M_PI | 3.14159265358979323846 | π |
M_PI_2 |
1.57079632679489661923 | π/2 |
M_PI_4 |
0.78539816339744830962 | π/4 |
M_1_PI |
0.31830988618379067154 | 1/π |
M_2_PI |
0.63661977236758134308 | 2/π |
M_SQRTPI | 1.77245385090551602729 | odmocnina z π |
M_2_SQRTPI |
1.12837916709551257390 | 2/odmocnina z π |
M_LNPI | 1.14472988584940017414 | log_e(π) |
M_SQRT2 | 1.41421356237309504880 | odmocnina z 2 |
M_SQRT3 | 1.73205080756887729352 | odmocnina z 3 |
M_SQRT1_2 |
0.70710678118654752440 | 1/odmocnina z 2 |
M_EULER | 0.57721566490153286061 | Eulerova konstanta |
To je ohledně matematiky a práce s čísly v PHP vše. Jak jste si sami všimli, spousta funkcí je zbytečná a nahrazuje mnohdy jen pomalu dva tři řádky kódu. Proto si zapamatujte jen ty nejdůležitější funkce a konstanty. Když se naopak dostanete do situace, že někde potřebujete spočítat něco velmi rychle, je dobrý nápad se podívat po zvláštních funkcích, jelikož jsou napsané v céčku a v PHP výpočty těžko uděláme tak rychle (např. zmíněnou Pythagorovu větu).
Zde ještě jednou nejdůležitější výpis funkcí:
round()
,ceil()
,floor()
,sin()
,cos()
,tan()
,base_convert()
,deg2rad()
,rad2deg()
,abs()
,log()
,mt_rand()
,pow()
,sqrt()
,fmod()
,min()
,max()
.
Pokud vás PHP funkce více zajímají, máme na ně celý kurz.
V následujícím kvízu, Kvíz - Tvorba knihoven a matematické funkce v PHP, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.