5.7 KiB
5.7 KiB
Matematické funkce a operace s čísly
Základní matematické funkce a operace s nimi
- Základní matematické funkce
- Funkce velmi často potřebné při běžných výpočtech
- Poskytovány třídou
java.lang.Math
(tj. třída Math je umístěna v balíku java.lang a není ji tedy třeba importovat) - statické metody, musí se tedy volat s názvem třídy
- např.
Math.jménoMetody();
- např.
- Většina metod má parametry typu
double
a vrací typdouble
- Pro většinu běžných matematických výpočtů se normálně používají reálná čísla
- Někdy mají i celočíselnou variantu, takže podle toho, zda jsou parametry
int
nebodouble
, vrátíint
nebodouble
- Kromě metod obsahuje konstanty
Math.PI
– hodnota πMath.E
– hodnota e
- příklad metod
- Absolutní hodnota
Math.abs(i);
- Větší a menší číslo
Math.max(i, j);
Math.min(d, e);
- Zaokrouhlování
Math.round(e);
- Absolutní hodnota
Generování (pseudo)náhodných čísel v Javě
- Třída
Math
- Obsahuje metodu
random()
, která vrací reálné náhodné číslo (typudouble
) z intervalu <0.0; 1.0) - Např.
double nahodne = Math.random();
- Obsahuje metodu
- Třída
Random
- Třída věnovaná náhodným číslům
- Je umístěná v balíku
java.util
, před jejím použitím je tedy nutno použít importimport java.util.Random;
- Je umístěná v balíku
- Obsahuje různé metody pro generování náhodných čísel s různými pravděpodobnostními rozděleními
- Metody třídy
Random
nejsou statické, proto se nevolají nad názvem třídy (jako metody třídyMath
)- Je nutná inicializace podobně jako u třídy
Scanne
Random r = new Random();
- Inicializuje třídu
Random
pro generování náhodných čísel s výchozí hodnotou získanou ze systémového času - Při každém spuštění programu se vygeneruje jiná posloupnost náhodných čísel
- Inicializuje třídu
Random r = new Random(výchozíHodnota)
- Inicializuje třídu
Random
pro generování náhodných čísel se zadanou výchozí hodnotou (celé číslo typulong
) - Při každém spuštění programu se vygeneruje stejná posloupnost náhodných čísel
- Je jedno, jakou výchozí hodnotu zadáme (vhodné může být např.
1
), podstatné je, že je konstantní (při každém spuštění stejná)
- Inicializuje třídu
- Metody se potom volají nad proměnnou
r
- Je nutná inicializace podobně jako u třídy
- Dvě velmi často používané metody
int nextInt(int max)
- Vrací celé číslo z intervalu <0; max – 1>
double nextDouble()
- Vrací reálné číslo z intervalu <0; 1)
- Funguje stejně jako metoda
Math.random();
- Třída věnovaná náhodným číslům
Problémy při provádění aritmetických operací
- Při provádění aritmetických operací může nastat několik problémů, se kterými je potřeba počítat
Výsledky celočíselných aritmetických operací implicitně typu int
- Výsledky celočíselných aritmetických operací (tj. hodnota výrazu) jsou v jazyce Java implicitně typu
int
- Výjimkou je datový typ
long
– pokud je alespoň jeden operand typulong
, výsledek aritmetické operace je typulong
- Výjimkou je datový typ
- Pokud používáme pouze typ
int
, s problémem se nesetkáme - Pokud používáme datové typy s menším rozsahem (
byte, short
), je potřeba výslednou hodnotu výrazu před přiřazením přetypovat
Celočíselné vs. reálné dělení
- V jazyce Java existuje pouze jeden operátor pro dělení – lomítko „/“, který se používá pro celočíselné dělení (tj. dělení se zbytkem) i reálné dělení
- Typ provedeného dělení záleží na obou operandech
- Pokud jsou oba operandy celá čísla (např. typu
int
), výsledek je celé číslo – podíl získaný celočíselným dělením - Pokud je alespoň jeden operand nebo oba operandy reálná čísla (např. typu double), výsledek je reálné číslo – podíl získaný reálným dělením (obecně desetinné číslo)
Přetečení a podtečení
- Přetečení
- Nastane, pokud do proměnné daného typu uložíme větší hodnotu, než je kapacita daného datového typu
- Např. do proměnné typu
byte
uložíme hodnotu 130 (maximální kladná hodnota uložitelná dobyte
je 127 - To nelze udělat přímo – dojde k chybě při překladu, ale snadno se to stane při ukládání výsledku aritmetické operace nebo při nevhodném přetypování
- Výsledek přetečení je uložení jiné hodnoty (často s opačným znaménkem, ale není to pravidlo)
- POZOR! – Přetečení není detekováno jako chyba, program se normálně přeloží a spustí => Zda k přetečení dojde, závisí na hodnotách operandů
- Podtečení
- Může nastat pouze u reálných čísel (u čísla nebo jeho exponentu)
- Hodnota, kterou se pokoušíme uložit, je menší než nejmenší zobrazitelná hodnota daným datovým typem (
float
nebodouble
) - Reálná čísla nemají nekonečnou přesnost, mají omezený počet desetinných míst, pokud uložíme velmi malé nenulové číslo (např. 1E-300), může se stát, že bude uloženo jako 0.0
Porovnávání reálných čísel
- Reálná čísla nemají nekonečnou přesnost, mají omezený počet desetinných míst – dochází k zaokrouhlování
- Proto není vhodné zjišťování, zda jsou dvě reálná čísla shodná, provádět pomocí relačního operátoru
„==“
- Např.
d1 == d2
- Např.
- Převést na porovnání, zda je absolutní hodnota rozdílu dvou reálných čísel menší než absolutní chyba porovnání (ε – vhodně zvolená malá reálná konstanta)
Např. Math.abs(d1 - d2) < EPSILON