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.
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));
}