NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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 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 jako exp(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) = logaritmus x o základu y. Pokud nezadáte základ, defaultní hodnotou je 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 dost předdefinovaných vlastních konstant. 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 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í.


 

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í:
182 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