Beide sind mathematische Werte, aber der Schwimmer hat mehr Präzision. Ist das der einzige Grund für den Fehler - der Unterschied in der Präzision? Oder gibt es ein anderes potentielles (und ernsthafteres) Problem?Warum gibt Splint (der C-Code-Checker) einen Fehler beim Vergleich eines Floats mit einem int?
Antwort
Dies liegt daran, dass die Menge der Integer-Werte nicht der Menge der Float-Werte für die Typen 'int' und 'float' entspricht. Zum Beispiel hat der Gleitkommawert 0,5 keine Gleichheit in der Ganzzahl gesetzt, und der Ganzzahlwert 4519245367 existiert möglicherweise nicht in der Menge von Werten, die ein Gleitkomma speichern kann. Der Checker kennzeichnet dies als ein Problem, das vom Programmierer überprüft werden muss.
Weil es wahrscheinlich keine sehr gute Idee ist. Nicht alle Floats können auf Ints gekürzt werden; Nicht alle Ints können in Floats konvertiert werden.
Da Floats keinen exakten int-Wert speichern können, also wenn Sie zwei Variablen haben, int i und float f, selbst wenn Sie "i = f;" zuweisen, wird der Vergleich "if (i == f)" wird wahrscheinlich nicht wahr zurückkehren.
Wenn Sie dies umgehen müssen (Sie haben einen legitimen Grund und sind glücklich, keine der in den anderen Antworten genannten Probleme sind ein Problem für Sie) dann einfach von einem Typ auf einen anderen zu übertragen.
Angenommen signierten ganzen Zahlen und IEEE-Gleitkomma-Format, die Größen von ganzen Zahlen, die dargestellt werden können, sind:
short -> 15 bits
float -> 23 bits
long -> 31 bits
double -> 52 bits
daher ein float
jede short
darstellen kann und eine beliebige double
long
darstellen kann.
Beim Vergleich wird der Integer-Wert in einen Gleitkommawert "hochgestuft". An diesem Punkt machen Sie einen genauen Gleichheitsvergleich zwischen zwei Gleitkommazahlen, was fast immer eine schlechte Sache ist.
Sie sollten im Allgemeinen eine Art "epsilon ball" haben, oder einen Bereich von akzeptablen Werten, und Sie machen den Vergleich, wenn die beiden Werte nah genug sind, um als gleich angesehen zu werden. Sie müssen eine Funktion in etwa wie folgt aus:
int double_equals(double a, double b, double epsilon)
{
return (a > (b - epsilon) && a < (b + epsilon));
}
Wenn Ihre Anwendung keine offensichtliche Wahl von Epsilon, dann DBL_EPSILON verwenden.
- 1. Warum erhalte ich beim direkten Vergleich zweier Enums einen Fehler?
- 2. Warum Vergleich nicht eine int
- 3. int mit size_t Vergleich
- 4. Warum gibt int = int * double einen Fehler und int * = double nicht (in Java)?
- 5. Vergleich Aufzählungen gibt Fehler
- 6. Warum gibt der folgende Code beim Konsum mehrerer Endpunkte eines WCF-Dienstes einen Fehler zurück?
- 7. Konvertieren eines Floats in einen Zeitbereich
- 8. Scala Slick Abfrage Vergleich eines benutzerdefinierten Benutzertyps (Enumeration) gibt Fehler
- 9. Warum gibt mein Programm einen Fehler beim Lesen von Datei?
- 10. Warum gibt Lib.current.stage einen Fehler?
- 11. Vergleich eines char-Werts mit einem Objekt
- 12. Warum verursacht CoUninitialize beim Beenden einen Fehler?
- 13. Gibt es einen Leistungsunterschied zwischen einem int und einer Struktur, die nur einen int enthält?
- 14. Sympy arbeitet mit int params, aber spinnt mit floats
- 15. NumberFormatException beim Analysieren eines int
- 16. Warum gibt mysql mir einen Fehler?
- 17. Warum gibt der Basisparameter einen Fehler im Layout-Inflator?
- 18. Warum gibt dieser Vergleich false zurück?
- 19. Warum erhalte ich einen Fehler beim Vergleich von NSString? (- [__ NSCFNumber isEqualToString:]: unerkannter Selektor an Instanz gesendet)
- 20. Anzahl der Floats zwischen zwei Floats
- 21. Warum gibt es einen Fehler in einem Wix-Projekt?
- 22. Warum gibt das Beispiel crawler4j einen Fehler?
- 23. Warum gibt ein 'char' einem 'char' einen Seg-Fehler? C++
- 24. Gibt es einen Vergleich der anfänglichen Listenkapazitäten für verschiedene Sprachen?
- 25. Warum gibt Socket.io mir einen 404 Fehler?
- 26. Warum gibt GL_LINEAR_MIPMAP_LINEAR einen INVALID_ENUM-Fehler?
- 27. Warum Floats anstelle der CSS-Eigenschaftstabelle verwenden
- 28. Redis gibt beim Speichern einen Fehler aus
- 29. Warum erhalte ich beim Verknüpfen einen Fehler mit mehreren Definitionen?
- 30. Vergleich Tupel Inhalte mit int in Python
Warnung: Die Funktion double_equals fehlt eine wichtige Eigenschaft der "regulären" Gleichheit. Es ist nicht transitiv. (Bei regelmäßiger Gleichheit, wenn x == y und y == z, dann x == z. Das ist nicht mehr wahr, wenn double_equals verwendet wird.) – bortzmeyer