FAV-ZCU/KIV PPA1/1. Matematické funkce a operace s čísly.md

5.7 KiB
Raw Permalink Blame History

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();
    • Většina metod má parametry typu double a vrací typ double
      • 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 nebo double, vrátí int nebo double
    • 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);

Generování (pseudo)náhodných čísel v Javě

  • Třída Math
    • Obsahuje metodu random(), která vrací reálné náhodné číslo (typu double) z intervalu <0.0; 1.0)
    • Např. double nahodne = Math.random();
  • 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 import import java.util.Random;
    • 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řídy Math)
      • 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
      • 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 typu long)
        • 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á)
      • Metody se potom volají nad proměnnou r
    • 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();

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 typu long, výsledek aritmetické operace je typu long
  • 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á do byte 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 nebo double)
    • 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
  • 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