2010-12-31 13 views
0

Ich war nicht wirklich sicher, wie ich den Titel nennen sollte.Schwierig arbeiten mit Floats

Ich überprüfe, ob der Wert von zwei Floats gleich sind. Wenn ich printf() oder NSLog() verwende, geben die Werte 0,750000 zurück. Eine Zeile wie if (value1 == value2) { return TRUE; } funktioniert jedoch nicht. Ich kann annehmen, dass in der Realität die Gleitkommazahlen außerhalb der 7 Dezimalstellen liegen und printf()/NSLog() keinen Wert über 7 Dezimalstellen hinaus zurückgeben kann.

Ich habe versucht, einen Weg zu googeln, um zu sehen, wie ich einen Float auf eine kleinere Anzahl von Dezimalstellen reduzieren oder einfach in einen anderen Datentyp konvertieren konnte, aber bisher hatte ich kein Glück.

+2

Seufzer ... http://docs.sun.com/source/806-3568/ncg_goldberg.html –

Antwort

1

Sie können sich für ein Epsilon entscheiden, bei dem es sich um den Maximalwert handelt, unter dem die Anzahl gleich ist. Wie

#define EPSILON 0.0001 

    if (fabs(floatA - floatB) < EPSILON) { retun TRUE; } 

fabs(x) kehrt der absolute Wert des doublex.

Sie können auch die double statt float Datentyp verwenden mögen (double sind doppelt so groß wie ein float).

0

Wann immer Sie Gleitkommazahlen vergleichen müssen Sie eine Toleranz verwenden:

if (Abs(value1 - value2) < epsilon) 
{ 
} 

wobei Epsilon Wert wie 0,000001

4

Sie bei float.h spähen möchten vielleicht ist (http: // www .gnu.org/software/libc/manual/html_node/Gleitkomma-Parameter.html) für eine nicht-beliebige Definition von Epsilon. Insbesondere FLT_EPSILON und FLT_DIG.