Matematické funkce v PHP

PHP Ostatní Matematické funkce v PHP

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.

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.

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 budete zaokrouhlovat.

Příklad:
round(5); // 5
round(5.1); // 5
round(5.4); // 5
round(5.5); // 6
round(5.8); // 6
round(5483.47621, 2); // 5483.47
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

Důležité je také upozornit jak PHP zpracovává různé formáty čísel. Kompilátor neřeší datový typ (vezme jak string tak float), ovšem problematická může být desetinná čárka vs. desetinná tečka. Tento problém lze vyřešit funkcí number_format (který si podrobně popíšeme u práce se stringy).

Příklad:
echo round("4,8"). "<br />"; // 4, jelikož kompilátor to usekne pouze na číslici 4
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

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ě. Ceil zaokrouhluje vždy nahoru, floor dolů. Není zde bohužel parametr na přesnost, tudíž to jde pouze jen na jednotky.

Příklad:
ceil(4.2); // 5
ceil(4.5); // 5
ceil(4.7); // 5
floor(4.2); // 4
floor(4.5); // 4
floor(4.7); // 4

Zde můžete i vidět porovnání těchto 3 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 5 -6 -6 -5 -6

Goniometrické funkce

Většina z nás zná 4 goniometrické funkce: sinus, cosinus, tangens, cotagens. PHP má však funkcí s goniometrií rovnou 12. Zde je jejich ukázka: sin, asin, sinh, asinh. Důležité je pro začátek zmínit, že parametr je v radiánech. Pokud byste chtěli zadávat úhel, musíte použít funkci deg2rad .

  • 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)

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.

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, tagens vám bude stačit. Mimochodem, pokud jste to ve škole zaspali, cotangens lze udělat jako 1/tan(x).

Příklad
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

deg2rad a rad2deg

Zmíněný převod mezi radiány a stupni.

Příklad:
echo deg2rad(45); //0.785398163
echo rad2deg(0.401425728); //23

Převod soustav

V PHP je několik funkcí na převod mezi různými soustavami. Ukažme si příklady:

Příklad:
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 osmičkové)

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.

is_finite ukazuje zda je číslo konečné.

Příklad
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
  • 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
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

  • abs(x) = vrací absolutní hodnotu
  • exp(x) = exponencioá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_PI2 1.57079632679­489661923 π/2
M_PI4 0.78539816339­744830962 π/4
M1_PI 0.31830988618­379067154 1/π
M2_PI 0.63661977236­758134308 2/π
M_SQRTPI 1.77245385090­551602729 odmocnina z π
M2_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

 

  Aktivity (1)

Článek pro vás napsal Snorlax
Avatar
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

Jak se ti líbí článek?
Celkem (4 hlasů) :
4.754.754.754.754.75


 


Miniatura
Všechny články v sekci
Ostatní tutoriály v PHP
Miniatura
Následující článek
DB wrapper s využití souborové cache

 

 

Komentáře

Avatar
Pavol Hejný
Redaktor
Avatar
Pavol Hejný:

Ještě bych rád doopravil v článku, že všchno to nejsou goniometrické funkce, jsou 4 kategorie těhdle funkcí:

Goniometrické funkce (Týkají se jednotkové kružnice)
Používají se na hrozně moc věcí. Např. vykreslování kružnic, elips, posunů....
sin();
cos();
tan();

Cyklometrické funkce (Týkají se jednotkové kružnice)
Výpočet úhlu z x a y. Převody kartézských a polárních souřadnic.
asin();
acos();
atan();

Hyperbolické funkce (Týkají se jednotkové hyperboly)
Dalo by se říct takové jednoduché přirovnání:

Elipsa, Kružnice, Kružnice s poloměrem 1
Hyperbola, Rovnoosá hyperbola, Jednotková hyperbola

Používají se např. při generévání terénu, fyzikálních simulacích.
sinh();
cosh(); //řetězovka
tanh();

Hyperbolometrické funkce (Týkají se jednotkové hyperboly)
asinh();
acosh();
atanh();

Odpovědět  +4 22.7.2015 14:37
http://pavolhejny.cz/
Avatar
gorri
Člen
Avatar
gorri:

Zdravím zkušenější programátory.
Narazil jsem na problém a už si s ním nevím rady, tak bych požádal profíky o radu.
Na stránce se mi přes funkci ob_start otevírají všechny soubory, které mám a potřebuji je zobrazit. Toto je řízeno podmínkou, že musí být v článku příznak, že patří do této kategorie.
Díky tomu se mi v dané kategorii zobrazí jen 10 článků, které potřebuji zobrazit. V každé kategorii je tomu jinak ale vše je řízeno podmínkou, že musí mít v článku příznak, který říká, že patří do této kategorie. Zároveň je s tím spojena ještě podmínka, že článek nesmí expirovat.
K tomuto jsem se rozhodnul vytvořit si funkci, která mi umožní zobrazovat určitý obsah (includem) pokud jich je zobrazeno minimálně 5.
Nicméně problém je, že ve chvíli kdy je příspěvků na stránce 5 (ošetřeno následovně: pokud je podmínka pro zobrazení příspěvku splněna tak rovnou zapíše do určité proměnné ++.
Jakmile je obsah proměnné například 4 tak chci aby se zobrazil includovaný soubor.
Bohužel ve chvíli kdy se spustí funkce tak někde mi to includuje soubor 5x a někde jen 1x nebo 2x. Chci aby se includoval pouze jednou a vždy po tom co je v proměnné 4 a 8.
Věděl by někdo co s tím?
Stránka je dělána bez MySQL.
Níže je ukázka kódu

funkce k zobrazení includovaného souboru
function reklamapr() {

if (($GLOBALS['re­klama'] == 4))
{
(include ('./includes/me­nu.php'));}
else {echo "";}

if (($GLOBALS['re­klama'] == 9))
{
(include ('./includes/me­nu.php'));}
else {echo "";}

}

podmínka, která vše řídí
if {echo "vypis" and $reklama++;} else {echo "none";}

$reklama++ má zvýšit při splnění podmínky $reklama o jedno číslo.
Moc děkuji všem za radu.
Snad jsem to vysvětlil tak aby se to dalo pochopit.
Dokázal by mi někdo s tímto poradit prosím?

 
Odpovědět 23. srpna 16:23
Avatar
gorri
Člen
Avatar
gorri:

Omlouvám se. Zde je podmínka, která řídí zobrazení příspěvku a zároveň i přičítá do $reklama když je podmínka splněna. Nevím proč se kód nezobrazil. Asi chyba mezi klávesnicí a křeslem :-D

if(($umisteni13 == 13) and (date("d-m-Y",$realnycas) < $expirace)) {echo "vypis" and $reklama++;} else {echo "none";}
 
Odpovědět 23. srpna 16:29
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.