Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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ý 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, 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í hodnotu
  • exp(x) = exponencionální funkce
  • expm1(x) = je definován jako exp(x)-1. Opět nějaká 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) = logaritmus x o základu y. Pokud nezadáte základ, je defaultní hodnota konstanta M_E -> 2.718281828459)
  • log10(x) = logaritmus o základu 10
  • log1p(x) = logaritmus (1+x)
  • min(x) a max(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) = mocnina x na y
  • sqrt(x) = vrací druhou odmocninu x

Statické funkce

  • getrandmax() = vrací maximální hodnotu funkce rand();
  • pi = vrací 3.1415926535898, stejné jako konstanta M_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.14159265358­979323846 π
M_PI_2 1.57079632679­489661923 π/2
M_PI_4 0.78539816339­744830962 π/4
M_1_PI 0.31830988618­379067154 1/π
M_2_PI 0.63661977236­758134308 2/π
M_SQRTPI 1.77245385090­551602729 odmocnina z π
M_2_SQRTPI 1.12837916709­551257390 2/odmocnina z π
M_LNPI 1.14472988584­940017414 log_e(π)
M_SQRT2 1.41421356237­309504880 odmocnina z 2
M_SQRT3 1.73205080756­887729352 odmocnina z 3
M_SQRT1_2 0.70710678118­654752440 1/odmocnina z 2
M_EULER 0.57721566490­153286061 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í.


 

Předchozí článek
Tvorba knihoven v PHP
Všechny články v sekci
Základní konstrukce jazyka PHP
Přeskočit článek
(nedoporučujeme)
Kvíz - Tvorba knihoven a matematické funkce v PHP
Článek pro vás napsal Snorlax
Avatar
Uživatelské hodnocení:
144 hlasů
Studuji jednu nejmenovanou pražskou střední školu - obor IT a rozhodl jsem se vám sdělit co to obnáší. Mladí se mohou rozhodnout zda je to dobrá cesta a ti co to už mají za sebou si mohou zavzpomínat popř. zjistit co se změnilo
Aktivity