Dnes si povieme niečo o rozsahu číselných premenných. Ukážeme si tiež niektoré užitočné funkcie, ktoré sme doteraz nespomínali. Slúžia na prácu s celými a desatinnými číslami.
Každé celé číslo má určitý rozsah hodnôt, ktoré môže nadobúdať. Tu je prehľad celočíselných typov a ich rozsahov (platí pre 32-bitový Free Pascal):
| Typ | Rozsah (vrátane) |
|---|---|
Byte |
0 .. 255 |
ShortInt |
-128 .. 127 |
Word |
0 .. 65 535 |
SmallInt |
-32 768 .. 32 767 |
LongWord |
0 .. 4 294 967 295 |
LongInt (integer) |
-4 294 967 296 .. 4 294 967 295 |
QWord |
0 .. 264-1 |
Int64 |
-263 .. 263-1 |
Vždy by sme mali použiť ten najmenší z číselných typov, ktorý dokáže uchovať všetky potrebné hodnoty. Napríklad, ak chceme do premennej uložiť číslo hodené na kocke, použijeme typ Byte. Ak máme v pláne použiť premennú ako počítadlo uplynutých mikrosekúnd, pravdepodobne zvolíme typ QWord.
Na rozdiel od celých čísel, desatinné čísla majú zvyčajne veľký rozsah, ale obmedzenú presnosť. Rozsah bežne používaného typu Real závisí od platformy. Tieto typy čísel majú „plávajúcu“ desatinnú čiarku (presnosť závisí od veľkosti čísla): Single, Double, Comp, Extended (zoradené od najmenej presných po najpresnejšie). Typ Currency má pevnú desatinnú čiarku - uchová vždy štyri desatinné čísla.
Miesto desatinnej čiarky používame bodku.
Ak vypíšeme desatinné číslo bežným spôsobom, pravdepodobne sa vypíše v tzv. vedeckej notácii. Preto použijeme špeciálne formátovacie parametre, ktoré majú nasledujúci tvar:
writeln(Cislo:PocetZnakov:Desatinne);
Cislo je číslo, ktoré chceme vypísať. PocetZnakov je minimálny počet znakov, ktoré sa vypíšu. Zvyšok sa vyplní medzerami - používa sa to na zarovnávanie. Desatinne je počet desatinných číslic. Príklad
writeln('Cislo:', 1.507:10:2);
vypíše:
Cislo: 1.51
Ak potrebujeme určiť iba počet desatinných miest, ktoré sa majú vypísať, môžeme ako prostredný parameter použiť nulu.
writeln('Prem = ', prem:0:4);
Čo sa stane, ak premennej priradíme hodnotu, ktorá je mimo jej rozsahu? Ukážeme si to na príklade. Toto je kód jednoduchého bezchybného programu:
program rozsah; var cislo: byte; begin cislo := 255; writeln(cislo); end.
Teraz kód upravíme. Skúsime zvýšiť hodnotu premennej cislo o 1.
cislo := 255; Inc(cislo); // ako cislo := cislo + 1 writeln(cislo);
Ak sme nemenili nastavenia Free Pascalu, po spustení programu dostaneme správu o chybe. Premenná cislo je typu byte a preto nemôže nadobudnúť hodnotu 256.
Skúsime však vypnúť kontrolu takýchto chýb (Range checking). Najjednoduchšie direktívou {$R-} priamo v zdrojovom kóde:
cislo := 255;
{$R-} // vypneme kontrolu chyb
Inc(cislo);
writeln(cislo);
Program prekvapivo nevypíše ani číslo 256, ani chybovú hlášku, ale vypíše:
0
Z čísla 255 sa pričítaním jednotky stala nula. Je to typický príklad javu nazývaného „pretečenie“ - hodnota akoby pretiekla z najvyššej hodnoty späť na najnižšiu. Pretečeniu by sme sa mali vyhýbať, ale sú aj prípady, keď je užitočné.
Pri rôznych výpočtoch sa nám určite zídu bežné matematické funckie. Niektoré môžeme používať ihneď, kvôli iným je nutné pridať jednotku math do sekcie uses.
Funkcia abs vráti absolútnu hodnotu čísla zadaného ako parameter. Sqrt je odmocnina.
Max vráti väčší z dvoch zadaných číselných parametrov, Min ten menší.
Trunc vráti celočíselnú časť desatinného čísla, Frac zas desatinnú. Round zaokrúhli číslo bežným spôsobom.
Význam funkcií sin, cos, tan a cotan určite nemusím vysvetľovať. Len dodám, že parameter je vždy v radiánoch (nie v stupňoch). Funkcia Pi (bez parametra) vráti hodnotu Ludolfovho čísla.
S použitím niektorej zo spomenutých funkcií skúsme vytvoriť program, ktorý zistí vzdialenosť dvoch desatinných čísel na číselnej osi. Čísla získame prečítaním z klávesnice.
Riešenie je v súbore vzdial.pas