Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací
Avatar
Marek Příhoda:24. listopadu 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. listopadu 16:14
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Marek Příhoda
Martin Dráb:24. listopadu 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. listopadu 17:52
2 + 2 = 5 for extremely large values of 2
Avatar
Marek Příhoda:24. listopadu 18:17

Díky za vysvětlení :)

 
Nahoru Odpovědět 24. listopadu 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.