Lekce 13 - Matematické funkce v Javě a knihovna Math
V minulé lekci, Vícerozměrná pole v Javě, jsme se věnovali vícerozměrným polím.
Naše on-line výuka Javy teď vlastně teprve začíná, nicméně v tomto kurzu 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 pochopitelně čí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:
{JAVA_CONSOLE}
System.out.println("Pí: " + Math.PI);
System.out.println("e: " + Math.E);
{/JAVA_CONSOLE}
Vidíme, že vše voláme na třídě Math
.
Konzolová aplikace
Pí: 3.141593
e: 2.718282
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í. Metoda
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ů). Metoda
ceil()
zaokrouhlí vždy nahoru a floor()
vždy
dolů.
Metodu 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. Metoda
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()
Metoda pow()
bere dva parametry typu double
, první
je základ mocniny a druhý exponent. Pokud bychom tedy chtěli spočíst např.
2^3
, kód by byl následující:
{JAVA_CONSOLE}
System.out.println(Math.pow(2, 3));
{/JAVA_CONSOLE}
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()
Metoda exp()
vrací Eulerovo číslo, umocněné na daný
exponent. Log vrací přirozený logaritmus daného čísla. Metoda
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:
{JAVA_CONSOLE}
System.out.println(Math.pow(8, (1.0/3.0)));
{/JAVA_CONSOLE}
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:
{JAVA_CONSOLE}
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);
{/JAVA_CONSOLE}
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í:
Konzolová aplikace
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;
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
%
:
{JAVA_CONSOLE}
System.out.println(5 % 2); // Vypíše 1
{/JAVA_CONSOLE}
Tak to bychom měli. V kurzu Základní konstrukce
jazyka Java naleznete ještě několik dalších příkladů k procvičení,
které určitě doporučujeme vypracovat. Na kurz nyní navazuje kurz 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
V příští lekci, Nejčastější chyby Java nováčků - Umíš pojmenovat proměnné?, si ukážeme nejčastější chyby začátečníků v Javě ohledně pojmenování proměnných.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 796x (2.82 kB)
Aplikace je včetně zdrojových kódů v jazyce Java
Komentáře


Zobrazeno 10 zpráv z 28. Zobrazit vše