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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top