2013-06-18 7 views
5
#include<stdio.h> 
int main() 
{ 
    float a,b; 
    a=4.375; 
    b=4.385; 

    if(a==4.375) 
     printf("YES\n"); 
    else 
     printf("NO\n"); 

    if(b==4.385) 
     printf("YES\n"); 
    else 
     printf("NO\n"); 

    return 0; 
} 

Answer tego kodu:Porównanie zmiennej jednego pływaka do jego wartości zawartej

YES 
NO 

Zawsze myślałem, jeśli porównać pływak z podwójną wartość. nigdy do niego nie pasuje. chyba że wartość jest czystą liczbą całkowitą. ale tu pływać „a” ma 4,375 dokładny jest w nim jednak „b” nie

printf("%0.20f\n",a); 
printf("%0.20f\n",b); 

This prints : 

4.37500000000000000000 
4.38500022888183593750 



but if i print 

printf("%0.20f\n",4.475); 

It prints 4.47499990463256835938 

Jak to efekt zaokrąglenia jest wyświetlany w niektórych, a nie w innych.

Czy ktoś może to wyjaśnić. jak "WE" powinien ocenić, kiedy wartość w zmiennej zmiennoprzecinkowej będzie pasować do wartości w niej zawartej, a kiedy nie?

+1

0.375 = 3/8, od 8 = 2^3, nie jest problem z przechowywaniem go w zmiennej binarnej – gkovacs90

+0

możliwy duplikat [dziwne wyjście w porównaniu z float z literałem float] (http://stackoverflow.com/questions/1839422/strange-output-in-comparison-of-float-with-float-literal) – devnull

+0

no not dupliate ..zapytałem różnicę między obiema sytuacjami sir :) –

Odpowiedz

1

Konwersja z ułamka dziesiętnego na ułamek binarny jest dokładna tylko wtedy, gdy ułamek dziesiętny można podsumować frakcji binarnych jak 0.5, 0.25 ... itd

Na przykład w przypadku

0,375 = 0,25 + 0,125 = 2 -2 + 2 -3

więc może być przedstawiony za pomocą dokładnie BI nary frakcje.

Gdzie jako numer 0.385 nie można przedstawić za pomocą precyzyjnych wartości binarnych. Zatem liczby takie jak 0.5, 0.25, 0.125, ... itp. Lub kombinacja tych liczb może być dokładnie odwzorowywana jako liczby zmiennoprzecinkowe. Inne, takie jak 0.385, dadzą nieprawidłowe wyniki, gdy wykonywane są na nich porównania lub operacje równościowe.

+0

Dzięki, mam to !! –

+0

, jeśli dokładność cyfr jest wielokrotnością 25, to. mecze inne nie! –

+1

Ta odpowiedź nie wyjaśnia, dlaczego '4.385' przechowywany w' a' nie jest równy dosłownemu '4.385'. Oba są, jak to opisuje ta odpowiedź, zbliżone do potęgi dwóch. Dobra odpowiedź powinna wskazywać rzeczywistą przyczynę różnicy: Obiekt 'float' ma mniejszą dokładność niż" podwójny "literał, więc nie mogą one równie dobrze przybliżać 4.385, a ich wartości są różne. –

1

Ruchome punkty nie są magiczne. Zawierają dokładną wartość i jeśli ją porównasz, będą porównywać równe. Dwa problemy są następujące: 1) Niektóre operacje nie zawsze są całkowicie dokładne ze względu na problemy z precyzją. Jeśli dodasz jedną do zmiennoprzecinkowego, a następnie odejmiesz jedną, dodając, że jedna z nich może spowodować utratę precyzji w bitach o najmniej znaczącej wartości, a po odjęciu nie powrócisz do takiej samej wartości, jakiej oczekujesz. 2) Nie jest możliwe dokładne przedstawienie każdej wartości dziesiętnej w formacie binarnym zmiennoprzecinkowym. Na przykład nie jest możliwe zapisanie dokładnej wartości 0.1 w liczbach zmiennoprzecinkowych w dokładnie taki sam sposób, w jaki nie można zapisać wartości 1/3.0 jako wartości dziesiętnej dokładnie bez względu na to, ile cyfr używasz.

Ale w twoim przypadku jeśli przechowujesz wartość i porównujesz ją z tą samą wartością, POWINNY ją porównać, ponieważ oba będą miały te same problemy w ten sam sposób. Twój numer jest jednak taki, że nie porównujesz go z podobnym. 4.375 i 4.385 nie są podwójami i są konwertowane do przechowywania, więc gdy porównasz je później, możliwe jest, że przekonwertowana wartość nie jest identyczna. Jeśli napiszesz 4.385f i 4.385f, aby użyć wartości zmiennoprzecinkowych, powinieneś otrzymać TAK oba razy.

Powiązane problemy