2008-09-01 3 views

Antwort

8

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.

3

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.

1

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.

0

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.

1

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 doublelong darstellen kann.

2

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

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

Verwandte Themen