10. díl - Matematické funkce v Java a knihovna Math

Java Základní konstrukce Matematické funkce v Java a knihovna Math

Náš seriál o Javě teď vlastně teprve začíná, nicméně v této sekci s tutoriály o těch nejzákladnějších konstrukcích jazyka jsme již u konce. Jsem rád, že jsme se úspěšně dostali až sem, další sekce se totiž bude věnovat objektově orientovanému programování. Budeme tam vytvářet opravdu zajímavé aplikace a i jednu hru. Sekci zakončeme odhlehčujícím článkem s přehledem matematických funkcí, které se nám v našich programech jistě budou v budoucnu hodit.

Základní matematické funkce jsou v Javě obsaženy v třídě Math. Třída nám poskytuje dvě základní konstanty: PI a E. PI je pochopitělně číslo Pí (3.1415...) a E je Eulerovo číslo, tedy základ přirozeného logaritmu (2.7182...). Asi je jasné, jak se s třídou pracuje, ale pro jistotu si na ukázku konstanty vypišme do konzole:

System.out.printf("Pí: %f \ne: %f", Math.PI, Math.E);

Vidíme, že vše voláme na třídě Math. Na kódu není nic moc zajímavého kromě toho, že jsme v textovém řetězci použili speciální znak \n, který způsobí odřádkování.

Výpis konstant na třídě Math, poskytující matematické funkce v Javě

Pojďme si nyní popsat metody, které třída poskytuje:

Metody na třídě Math

min(), max()

Začněme s tím jednodušším :) Obě funkce berou jako parametr dvě čísla libovolného datového typu. Funkce min() vrátí to menší, funkce max() to větší z nich.

round(), ceil(), floor()

Všechny tři funkce se týkají zaokrouhlování. Round() bere jako parametr desetinné číslo a vrací zaokrouhlené číslo typu double tak, jak to známe ze školy (od 0.5 nahoru, jinak dolů). Ceil() zaokrouhlí vždy nahoru a floor() vždy dolů.

Round() budeme jistě potřebovat často, další funkce jsem prakticky často použil např. při zjišťování počtu stránek při výpisu komentářů v knize návštěv. Když máme 33 příspěvků a na stránce jich je vypsáno 10, budou tedy zabírat 3.3 stránek. Výsledek musíme zaokrouhlit nahoru, protože v reálu stránky budou samozřejmě 4.

abs() a signum()

Obě metody berou jako parametr číslo libovolného typu. Abs() vrátí jeho absolutní hodnotu a signum() vrátí podle znaménka -1, 0 nebo 1 (pro záporné číslo, nulu a kladné číslo).

sin(), cos(), tan()

Klasické goniometrické funkce, jako parametr berou úhel typu double, který považují v radiánech, nikoli ve stupních. Pro konverzi stupňů na radiány stupně vynásobíme * (Math.PI/180). Výstupem je opět double.

acos(), asin(), atan()

Opět klasické cyklometrické funkce (arkus funkce), které podle hodnoty goniometrické funkce vrátí daný úhel. Parametrem je hodnota v double, výstupem úhel v radiánech (také double). Pokud si přejeme mít úhel ve stupních, vydělíme radiány / (180 / Math.PI).

pow() a sqrt()

Pow() bere dva parametry typu double, první je základ mocniny a druhý exponent. Pokud bychom tedy chtěli spočíst např. 23, kód by byl následující:

System.out.println(Math.pow(2, 3));

Sqrt je zkratka ze square root a vrátí tedy druhou odmocninu z daného čísla typu double. Obě funkce vrací výsledek jako double.

exp(), log(), log10()

Exp() vrací Eulerovo číslo, umocněné na daný exponent. Log vrací přirozený logaritmus daného čísla. Log10() vrací potom dekadický logaritmus daného čísla.

V seznamu metod nápadně chybí libovolná odmocnina. My ji však dokážeme spočítat i na základě funkcí, které Math poskytuje.

Víme, že platí: 3. odm. z 8 = 8^(1/3). Můžeme tedy napsat:

System.out.println(Math.pow(8, (1.0/3.0));

Je velmi důležité, abychom při dělení napsali alespoň jedno číslo s desetinnou tečkou, jinak bude Java předpokládat celočíselné dělení a výsledkem by v tomto případě bylo 80 = 1.

Dělení

Programovací jazyky se často odlišují tím, jak v nich funguje dělení čísel. Tuto problematiku je nutné dobře znát, abyste nebyli poté (nepříjemně) překvapeni. Napišme si jednoduchý program:

int a = 5 / 2;
double b = 5 / 2;
double c = 5.0 / 2;
double d = 5 / 2.0;
double e = 5.0 / 2.0;
// int f = 5 / 2.0;

System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);

V kódu několikrát dělíme 5 / 2, což je matematicky 2.5. Jistě ale tušíte, že výsledek nebude ve všech případech stejný. Troufnete si tipnout si co kdy vyjde? Zkuste to :)

Kód by se nepřeložil kvůli řádku s proměnnou f, proto jsme ho zakomentovali. Problém je v tom, že v tomto případě vyjde desetinné číslo, které se snažíme uložit do čísla celého (int). Výstup programu je poté následující:

2
2.0
2.5
2.5
2.5

Vidíme, že výsledek dělení je někdy celočíselný a někdy reálný. Přitom vůbec nezáleží na datovém typu proměnné, do které výsledek ukládáme, ale na datovém typu čísel, které dělíme. Pokud je jedno z čísel desetinné, je výsledek vždy desetinné číslo. 2 celá čísla vrátí vždy zas celé číslo, dejte si na to pozor např. když budete počítat průměr, pro desetinný výsledek je nutné alespoň jednu proměnnou přetypovat na desetinné číslo.

int soucet = 10;
int pocet = 4;
double prumer = (double)soucet / pocet;

Pozn.: Např. v jazyce PHP je výsledek dělení vždy desetinný, až budete dělit v jiném programovacím jazyce než v Javě, zjistěte si jak dělení funguje než jej použijete.

Zbytek po celočíselném dělení

V našich aplikacích můžeme často potřebovat zbytek po celočíselném dělení (tzv. modulo). U našeho příkladu 5 / 2 je celočíselný výsledek 2 a modulo 1 (zbytek). Modulo se často používá pro zjištění zda je číslo sudé (zbytek po dělení 2 je 0), když chcete např. vybarvit šachovnici, zjistit odchylku vaší pozice od nějaké čtvercové sítě a podobně.

V Javě a obecně v céčkových jazycích zapíšeme modulo jako %:

System.out.println(5 % 2); // Vypíše 1

Tak to bychom měli. V sekci Základní konstrukce jazyka Java zájemci naleznou ještě několik dalších článků a příkladů k procvičení. Seriál nyní pokračuje v sekci Základy objektově orientovaného programování v Javě . Příště si tedy představíme objektový svět a pochopíme mnoho věcí, které nám až doteď byly utajovány :)


 

Stáhnout

Staženo 637x (16.41 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (2)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

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


 


Miniatura
Předchozí článek
Cvičení k 9. lekci Javy
Miniatura
Všechny články v sekci
Základní konstrukce jazyka Java

 

 

Komentáře

Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

ahoj chci se zeptat jestli Java zvládá záporná čísla např.-1,-5,atd...

Odpovědět 23.2.2015 18:49
Lepší být šprt než blbec :)
Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

aha děkuju tohle jsem nějak přehlídl :-)

Odpovědět 23.2.2015 19:51
Lepší být šprt než blbec :)
Avatar
madrlukas
Člen
Avatar
madrlukas:

Je tam menší nepřesnost - round() vrací hodnotu typu int, ceil() a floor() vrací hodnotu typu double..

 
Odpovědět  +1 17.3.2015 11:06
Avatar
gold604
Člen
Avatar
gold604:

Čaute, ako reštartujem Java aplikáciu?

 
Odpovědět 4.11.2015 18:40
Avatar
Odpovídá na gold604
Štefan Pružinský:

Máš na mysli reštart v kóde? Možno Ti pomôže toto: http://stackoverflow.com/…-application. :)

Odpovědět 4.11.2015 20:53
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Johnny Cook
Člen
Avatar
Johnny Cook:

Dvě úpravy:

  • V komentářích zmíněný round() vrací hodnotu typu int.
  • Z radiánů na stupně: Vynásobíme radiány*(180/Mat­h.PI) nebo je můžeme vydělit /(Math.PI/180).
 
Odpovědět 1. července 13:02
Avatar
hricov.martin:

Dobry den,chcel by som sa spytat ohladom programovanie funkcii v Jave je tu niejaky ten tutorial?

 
Odpovědět 30. července 19:06
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na hricov.martin
pocitac770:

OOP, je to vlastně to samé, akorát posunuté rovnou na úroveň objektů, čistě programování statických funkcích do hlavní třídy je prostě... nečisté, tak je lepší to ani neučit a rovnou to naučit v souvislosti s třídami a objekty.

Editováno 16. srpna 21:11
 
Odpovědět 16. srpna 21:11
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 9 zpráv z 9.