Desetinné číselné typy
Pokud budete chtít provádět výpočty s desetinnými čísly, tak můžete využít datové typy s tzv. plovoucí řádovou čárkou (floating point numbers). Hodnoty těchto datových typů umožňují pracovat s čísly, které se skládají z celé a z desetinné části. Díky tomu, jak jsou navržena, tato čísla dokáží reprezentovat jak velmi malé, tak velmi velké hodnoty (za cenu menší přesnosti desetinné části).
V C jsou dva základní vestavěné datové typy pro práci s desetinnými čísly, které se liší velikostí (a tedy i tím, jak přesně dokáží desetinná čísla reprezentovat). Oba dva typy jsou znaménkové:
Název | Počet bytů | Rozsah hodnot | Přesnost | Se znaménkem |
---|---|---|---|---|
float | 4 | [-3.4x1038; 3.4x1038] | ~7 des. míst | |
double | 8 | [-1.7x10308; 1.7x10 308] | ~16 des. míst |
Slovo double
pochází z pojmu "double precision", tedy dvojitá přesnost (typ float
se také někdy
označuje pomocí "single precision").
Pokud chcete v programu vytvořit výraz datového typu double
, stačí napsat desetinné číslo (jako
desetinný oddělovač se používá tečka, ne čárka): 10.5
, -0.73
. Pokud chcete vytvořit výraz typu
float
, tak za toto číslo ještě přidejte znak f
: 10.5f
, -0.73f
.
Formátovaný výstup desetinných čísel
Pokud chcete vytisknout na výstup hodnotu datového typu float
nebo double
, můžete použít
zástupný znak %f
:
printf("Desetinne cislo: %f\n", 1.0);
Jednoduché použití zástupného znaku %f
však způsobí, že se desetinné číslo vypíše v rozvoji,
tj. pro číslo 1.0
se vypíše do termínálu 1.000000
.
Abychom mohli specifikovat, kolik číslic chceme vypsat za desetinnou tečkou, musíme k zástupnému znaku
doplnit formátování. Pro datový typ float
a double
používáme následující syntaxi:
printf("Desetinne cislo: %.2f\n", 1.0);
kde před zástupný znak f
napíšeme .
a doplníme požadovaným počtem číslic za desetinnou tečkou.
Takto specifikovaný řetězec se zástupným znakem již vytiskne číslo 1.00
.
Přesnost desetinných čísel
Je třeba si uvědomit, že desetinná čísla v počítači mají pouze konečnou přesnost a jsou reprezentována v dvojkové soustavě:
- V počítači nelze reprezentovat iracionální čísla s nekonečnou přesností. Pokud tedy chcete do paměti
uložit například hodnotu
π
, budete ji muset zaokrouhlit. - Kvůli použití dvojkové soustavy některé desetinné hodnoty nelze vyjádřit přesně. Například číslo
\( \frac{1}{3} \) lze v desítkové soustavě vyjádřit zlomkem, ale v dvojkové soustavě toto číslo
má nekonečný desetinný rozvoj (
0.010101…
) a opět tedy nelze vyjádřit přesně:#include <stdio.h> int main() { printf("%f\n", 1.0 / 3.0); return 0; }
Konverze na celé číslo
Pokud budete konvertovat desetinné číslo na celé číslo, tak dojde k "useknutí" desetinné části:
#include <stdio.h>
int main() {
printf("%d\n", (int) 1.6);
printf("%d\n", (int) -1.6);
return 0;
}
Toto chování odpovídá zaokrouhlení k nule, tj. kladná čísla se zaokrouhlí dolů a záporná čísla nahoru.
Kvíz 🤔
-
Co vypíše následující program?
#include <stdio.h> int main() { printf("%d\n", 1.5); return 0; }
Odpověď
Tento program obsahuje nedefinované chování 💣. Pokud při použití příkazu
printf
v textu mezi uvozovkami použijeme zástupný znak%d
, musíme za čárkou předat výraz datového typu celého čísla. Zde jsme ale předali výraz datového typu desetinného čísla. -
Co vypíše následující program?
#include <stdio.h> int main() { float a = 2.0f; float b = 5.0f; int c = b / a; printf("%d\n", c); return 0; }
Odpověď
Program vypíše
2
, protože výraz desetinného číselného typub / a
, který se vyhodnotil na2.5
, byl poté uložen do proměnné celočíselného typu, která si z něj ponechala pouze celou část, tj.2
.