[C] Operacje na float. Dziwny wynik.

0
 #include <stdio.h>

void main(void)
{
    float a=609.889;
    float u;
    int ulamek;

    u=(a-609)*1000;
    ulamek=(int)u;    

    printf("%d",ulamek);
    while(1);
}

Wynikiem tego powinno być 889, to czemu wychodzi na konsole 888?

Jeśli zamiast

u=(a-609)*1000; 

wstawię u=(609.889-609)*1000;

 to wynikiem jest 889.
0

Jest to związane z błędem jakim są obarczone działania na liczbach zmiennoprzecinkowych. Użyj double zamiast float

0

double zwiększy precyzję, ale nie zlikwiduje problemu – będzie tylko trudniej taki błąd wywołać.
liczby zmiennoprzecinkowe sprawdzają się w praktycznych obliczeniach, pod warunkiem że:
· nie przeszkadza nam błąd na którymś tam miejscu po przecinku (nie jest potrzebna absolutna dokładność – a zwykle nie jest)
· nie chcemy tych liczb bezpośrednio wyświetlać, bo nawet jeśli błąd na dziesiątym miejscu jest całkowicie nieistotny, to 9,0 wygląda znacznie ładniej niż 8,9999999998

0

Niestety C++ nie ma wbudowanego typu stałoprzecinkowego, ale nic nie stoi na przeszkodzie, żeby taki sobie stworzyć. I za jego pomocą realizować obliczenia o wybranej dokładności

1 użytkowników online, w tym zalogowanych: 0, gości: 1