Front-end Front-end
Probíhá výprodej HTML, JavaScript a Bootstrap. Slevy až 80 %
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde
Avatar
Marek Příhoda:24.11.2018 16:14

Ahoj, vrtá mi hlavou, proč výsledek programu

float cislo1, cislo2, soucin;
cislo1 = 3.1;
cislo2 = 5.2;
soucin = cislo1 * cislo2;
printf("%f", soucin);
while (1);
return 0;

je 16.119999

pokud dám datový typ double, tak vyjde součin korektně 16.2. Díky

 
Odpovědět 24.11.2018 16:14
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Marek Příhoda
Martin Dráb:24.11.2018 17:52

Vzhledem k binární reprezentaci čísel v plouvoucí řádové čárce (fypy float, double aj.), která se řídí podle IEEE 754 a vzhledem k malé velikosti typu float kvůli zaokrouhlování dojde k menší odchylce.

Čísla jako 3.1 a 5.2 totiž do datového typu float přesně nezaznamenáš (ani do double, ale ten má větší přesnost, takže na tvém příkladu vše vypadá OK). Pokud jde o řády za desetinnou čárkou, zaznamenáš pouze záporné mocniny dvojky (1/2, 1/4...) a jejich součty, ale nic víc. A třeba 0.1 ze záporných mocnin dvojky nesložíš, i kdybyses rozkrájel :-).

Nahoru Odpovědět  +3 24.11.2018 17:52
2 + 2 = 5 for extremely large values of 2
Avatar
Marek Příhoda:24.11.2018 18:17

Díky za vysvětlení :)

 
Nahoru Odpovědět 24.11.2018 18:17
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.