2013-06-18 15 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; 
} 

Antwort von diesem Code:Vergleich einer Variablen vom Typ float den darin enthaltenen Wert

YES 
NO 

Ich dachte immer, wenn ich einen Schwimmer mit doppelten Wert vergleichen. es wird niemals dazu passen. es sei denn Wert ist reine Ganzzahl. aber hier schweben „a“ hat 4.375 genau drin ist, aber „b“ nicht

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 

Wie wird dieser Rundungseffekt wird in einigen und in anderen nicht zeigen.

Kann jemand dies erklären. Wie sollte "WE" beurteilen, wenn der Wert in der float-Variablen mit dem darin enthaltenen übereinstimmt und wenn nicht?

+1

0.375 = 3/8, seit 8 = 2^3, ist es kein Problem, es in einer binären Variablen zu speichern – gkovacs90

+0

mögliche Duplikat von [seltsame Ausgabe im Vergleich von Float mit Float Literal] (http://stackoverflow.com/questions/1839422/merkwürdiger-Ausgabe-im-Vergleich-von-float-mit-float-literal) – devnull

+0

nein nicht doppelt ..Ich fragte Unterschied zwischen beiden Situationen Herr :) –

Antwort

1

Die Umwandlung von Dezimalbruch auf eine Binärbruch nur präzise, ​​wenn die Dezimalbruch durch binäre Fraktionen wie 0.5 aufsummiert werden kann, 0.25, ..., usw.

Zum Beispiel im Fall

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

So kann es genau durch bi dargestellt werden unter Verwendung von nary Fraktionen.

Wo die Nummer 0.385 kann nicht durch die Verwendung von Binärzahlen genau dargestellt werden. So können Zahlen wie 0.5, 0.25, 0.125, ..., usw. oder eine Kombination dieser Zahlen genau als Fließkommazahlen dargestellt werden. Andere wie 0.385 geben falsche Ergebnisse, wenn Vergleichs- oder Gleichheitsoperationen an ihnen ausgeführt werden.

+0

Danke jetzt habe ich es !! –

+0

wenn die Genauigkeitsziffern ein Vielfaches von 25 sind. passt sonst nicht! –

+1

Diese Antwort erklärt nicht, warum '4.385', gespeichert in' a', nicht gleich einem Literal '4.385' ist. Beide sind, wie diese Antwort beschreibt, mit Zweierpotenzen angenähert. Eine gute Antwort sollte die tatsächliche Ursache des Unterschieds angeben: Das "float" -Objekt hat eine geringere Genauigkeit als das "doppelte" Literal, daher können sie sich nicht genauso gut an 4.385 annähern und ihre Werte sind unterschiedlich. –

1

Gleitende Punkte sind keine Magie. Sie enthalten einen genauen Wert und wenn Sie es vergleichen, werden sie gleich vergleichen. Die beiden Probleme sind 1) Einige Operationen sind aufgrund von Genauigkeitsproblemen nicht immer exakt. Wenn Sie einen Wert zu einem Gleitkommawert addieren und ihn dann subtrahieren, führt das Hinzufügen dieses Werts zu einem gewissen Genauigkeitsverlust in den niedrigstwertigen Bitwerten, und wenn Sie ihn subtrahieren, erhalten Sie nicht den gleichen Wert wie erwartet. 2) Es ist nicht möglich, jeden Dezimalwert im Fließkomma-Binärformat genau darzustellen. Zum Beispiel ist es nicht möglich, den exakten Wert von 0,1 in einer Fließkomma-Binärzahl genau so zu speichern, wie Sie den Wert von 1/3.0 nicht als Dezimalwert genau schreiben können, egal wie viele Ziffern Sie verwenden.

Aber in Ihrem Fall Wenn Sie einen Wert speichern und vergleichen Sie es mit dem gleichen Wert, sie sollten gleich vergleichen, da sie beide die gleichen Probleme auf die gleiche Weise haben. Ihr Problem ist, dass Sie nicht mit Gleichem vergleichen. 4.375 und 4.385 sind keine Gleitkommazahlen, sie werden verdoppelt und zum Speichern konvertiert. Wenn Sie sie später vergleichen, ist es möglich, dass der konvertierte Wert nicht ganz identisch ist. Wenn Sie 4.385f und 4.385f schreiben, um Gleitkommawerte zu verwenden, sollten Sie beide Male JA erhalten.

Verwandte Themen