Lekce 18 - 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í. A nalezneme zde samozřejmě i matematické funkce. Dnes si představíme ty nejdůležitějších a nejpoužívanějších z nich.
Funkce round()
,
ceil()
, floor()
Někdy nám při výpočtech vyjdou čísla jako 3,185643854. A ne vždy potřebujeme takto přesné číslo nebo dokonce vůbec jeho desetinnou část. A na to tu máme 3 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ě tak nahoru.
Druhým parametrem se dá i určit 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ůžete nastavit
mód. Zde se dá nastavit "půlící hodnota", tzn. číslice 5
,
zda se zaokrouhlí nahoru či dolů. Pro podrobnější pochopení těchto
módů si doporučuji přečíst oficiální dokumentaci a nebo si jednoduše
chvíli zkoušet a hrát si s tím. 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 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íž to jde pouze jen na jednotky. Zde můžete i vidět porovnání těchto třech 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ý sinusasin()
= arkus sinus (inverzní funkce k sinus, možná znáte z kalkulaček jako sin−1)sinh()
= hyperbolický sinusasinh()
= 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, trvalo nám dlouho zjistit, oč se vlastně jedná. Funkce by měla fungovat stejně jako sinus, ale hodnoty nejsou na jednotkové kružnici, ale na jednotkové hyperbole.
Příklad
Stejné zastoupení má i cosinová funkce (cos()
,
acos()
, cosh()
, acosh()
) a tangens
(tan()
, atan()
, tanh()
,
atanh()
). Navíc je však zde funkce atan2()
, kde
počítá se dvěma hodnotami, a je to, jako bychom počítali arkus tangens y/x
s tím rozdílem, že funkce podle znamének vybere kvadrant. Věřím ale, že
tyto funkce opravdu jen tak nevyužijete a klasický sinus, cosinus, tangens
vám bude stačit. Mimochodem, pokud jste to ve škole zaspali, cotangens 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 cotangens) 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í s č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 o funkce na mocninu, odmocninu, logaritmus, minimum či maximum:
abs(x)
= vrací absolutní hodnotuexp(x)
= exponencionální funkceexpm1(x)
= je definován jakoexp(x)-1
. Opět nějaká zvláštní matematická funkcefmod(x, y)
= vrací desetinný zbytek po celočíselném dělení x/yhypot (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, je defaultní hodnota 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 předefinované vlastní konstanty, a dost je jich i v PHP. 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 vše ohledně matematiky a práce s čísly v PHP. Jak sami jste si všimli, spousta funkcí je zbytečná a nahrazují někdy jen pomalu 2 – 3 řá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 je 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í.