2016-04-08 5 views
0

Ich möchte Schwimmern wie diese vergleichen:Was ist der maximale absolute Fehler für Gleitkommavergleiche?

void assertEquals(CGFloat f, CGFloat g) { 
    NSCAssert(fabs(f-g) < 0.1); 
} 

void assertLE(CGFloat f, CGFloat g) { 
    NSCAssert(f <= g + 0.1); 
} 

Gibt es eine engere bound ich als 0,1 verwenden kann? Was ist der maximale Fehler, den ein Gleitkommavergleich haben kann? Gibt es ein Makro, damit ich die Nummer nicht fest codiere?

+0

Siehe http://stackoverflow.com/questions/10334688/how-dangerous-is-it-to-compare-floating-point-values ​​und seine erste Antwort. – rmaddy

+0

Danke, aber das gibt nur eine relative, nicht eine absolute Grenze. –

Antwort

4

Der maximale Rundungsfehler in einer binären Fließkommaberechnung IEEE 754 32-Bit ist etwa 1e31. Ich kann es in Java mit diesem Programm berechnet:

public class Test { 
    public static void main(String[] args) { 
    float biggest = Float.MAX_VALUE; 
    float nextBiggest = Math.nextDown(biggest); 
    float gap = biggest - nextBiggest; 
    System.out.println(gap/2); 
    } 
} 

Es Hälfte der Abstand zwischen den beiden größten endlichen Zahlen. Sie können eine ähnliche Berechnung in Objective-C für das von Ihnen verwendete Format durchführen. Es wird viel zu groß sein, um Berechnungen mit vertretbarem Betrag zu verwenden.

Sie müssen wirklich mit einem relativen Fehler arbeiten, entweder explizit oder indem Sie eine feste Grenze auswählen, die für die Größen Ihrer Zahlen geeignet ist.

+0

Danke. In Bezug auf Ihren relativen Fehler ist es für meinen Anwendungsfall Overkill, bei dem es sich um einen Test für ein UI-Layout handelt, zu behaupten, dass eine Ansicht dort beginnt, wo die vorherige endet. Ich denke, kaum einer der Codes, die ich geschrieben habe, brauchte diese Präzision. Ich kontrolliere zum Beispiel nicht die Flugbahn einer Rakete. –

+0

@KartickVaddadi Für UI-Layout werden die meisten Ihrer Zahlen in einigen Größenordnungen voneinander abweichen. In diesem Fall würde ich ein festes Epsilon wählen, das mit diesen Zahlen arbeitet. Du wirst nicht in der Lage sein, das gleiche Epsilon zu verwenden, wenn du zur Astrophysik wechselst. –

Verwandte Themen