Reálne čísla

Okrem celých čísel máme v C++ aj reálne. Pre ne máme typ double, načítavame a vypisujeme ich pomocou značky %lf, pri výpise vieme ovplyvniť počet vypísaných desatinným miest %<pocet>lf ako vidíme v príklade:

int main() {
    double a;
    scanf("%lf", &a);
    printf("%2lf\n", a);
    cin >> a;
    cout << a << endl;
}

Keď chceme napísať nejakú reálnočíselnú hodnotu, môžeme buď pretypovať double(7), alebo napísať desatinnú bodku 7.0.

Pri práci s reálnymi číslami si musíme dávať obrovský pozor na presnosť. Napríklad (5.1 - 3.1 - 2.0 == 0.0) vráti false. Počas výpočtov totiž dochádza k drobným zaokúhľovaniam.

Ilustrovať si to vieme nasledovným príkladom: majme kalkulačku, ktorá počíta v desiatkovej sústave a má presnosť 3 desatinné miesta. V matematike $1 - 1/3 - 1/3 - 1/3 = 0$, ale v kalkulačke $1.000 - 0.333 - 0.333 - 0.333 = 0.001 \neq 0.000$.

V skutočnosti však double nemá presnosť na nejaký počet desatinných miest, ale na nejaký počet cifier. Keby naša kalkulačka mala presnosť na 4 cifry, tak 543210 by sa zaokrúhlilo na 543200. Takže keď používame doubley, tak nastávajú nepresnosti aj v celých číslach.

Podobne napríklad vďaka tomu vieme nájst nenulové $a,b$ také, že $a + b = a$. Napríklad $1000 + 0.01 = 1000$. Takisto výsledok $a + b + c$ môže závisieť od poradia sčiťovania. $(1000 + 0.4) + 0.4 = 1000 + 0.4 = 1000$, ale $1000 + (0.4 + 0.4) = 1000 + 0.8 = 1001$.

double ukladá 52 binárnych cifier, teda približne 15 desiatkových. Pri väčšom počte operácií presnosť výsledku klesá.

Najväčšie číslo, aké je double schopný reprezentovať je približne $10^{300}$.

Dôležité je nepoužívať a == b ale miesto toho napríklad abs(a-b)<1e-8. 1e-8 je zhruba $0.1^8 = 0.00000001$. abs je funkcia, ktorá vracia absolútnu hodnotu (odstráni znamienko) a nachádza sa v knižnici cmath.

Knižnica cmath

V knižnici cmath sa nachádza aj zopár ďalších zaujímavých funkcií. Napríklad sqrt(x) $= \sqrt{x}$, exp(x) $= e^x$, log(x) je prirodzený logaritmus $x$, pozná aj goniometrické funkcie sin(x), cos(x) a mnoho ďalších, ktoré nájdete na tu. Všetky pracujú s reálnymi číslami.

#include <cstdio>
#include <cmath>

int main() {
    double d;
    scanf("%lf", &d);
    printf("%lf\n", sqrt(d));
}