File: Stare vježbe/vjezbe02/14__limits_float.c
/* 14__limits_float.c Greske zaokruzivanja kod tipa float Napomena: Ovaj primjer obavezno compilirati s ANSI C kompatibilnim compilerom (npr. GCC) */ #include <stdio.h> /* Tip float <--> IEEE-754 standard za jednostruku preciznost: |x|xxxxxxxx|xxxxxxxxxxxxxxxxxxxxxxx| (32 bita) predznak - 1 bit karakteristika - 8 bitova (sluzi za spremanje eksponenta) mantisa - 23 bita */ int main () { float f; double d; /* 1E9 i 1E10 ce se ispisati ispravno (tocno), no vec 1E11 (pa i 1E12) vise nece */ f=1E9f; f=1E10f; f=1E11f; f=1E12f; /* Uzrok pogresnog ispisivanja gornjih brojeva lezi u cinjenici da tip float ima preciznost od 23 binarne znamenke. Slijedeci primjer pokazat ce nam koja je to granica kada tip float postaje "neprecizan". */ /* Primijetimo da je 16777215 == 2^24-1 */ f=16777215.f; f=f+1; /* Da bismo mogli zbrojiti 2^24 i 1 trebale bi nam minimalno 24 binarne znamenke u mantisi. Stoga ispada da 2^24+1 iznosi 2^24. */ f=f+1; /* Ukoliko prethodni primjer provedemo na tipu double vidjet cemo da se nece pojaviti navedeni problem buduci da tip double (64 bita) ima (daleko) vecu preciznost od tipa float */ d=16777215.; d=d+1; d=d+1; return 0; }
|