Fehler in fminf und fmaxf auf iOS 64-Bit-Prozessoren
Frage
Ich bin auf einen Fehler bei den 64-Bit-Prozessoren gestoßen, den ich mitteilen wollte.
CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;
value = fmaxf( test1, test2 );
Das Ergebnis wäre:
Wert = 0,5799999833106995
Dies ist offensichtlich ein Rundungsproblem, aber wenn Sie überprüfen müssten, welcher Wert ausgewählt wurde, würden Sie ein falsches Ergebnis erhalten.
if( test1 == value ){
// do something
}
Wenn Sie jedoch entweder MIN( A, B ) oder MAX( A, B ) verwenden, würde es wie erwartet funktionieren.
Ich dachte, das wäre es wert, geteilt zu werden
Danke
Lösung
Das hat nichts mit einem Bug-In zu tun fminf
oder fmaxf
.Es gibt einen Fehler in Ihrem Code.
Auf 64-Bit-Systemen CGFloat
ist typdefiniert double
, aber Sie verwenden die fmaxf
Funktion, die ausgeführt wird float
(nicht double
), wodurch seine Argumente auf einfache Genauigkeit gerundet werden und sich so der Wert ändert.Tu das nicht.
Auf 32-Bit-Systemen passiert dies nicht, weil CGFloat
ist typdefiniert float
, passend zum Argument und Rückgabetyp von fmaxf
;Es erfolgt keine Rundung.
Stattdessen entweder include <tgmath.h>
und nutzen fmax
ohne das f
Suffix oder Verwendung float
anstatt CGFloat
.