Bug in fminf e fmaxf sui processori iOS a 64 bit
Domanda
Mi sono imbattuto in un bug con i processori a 64 bit che volevo condividere.
CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;
value = fmaxf( test1, test2 );
Il risultato sarebbe:
valore = 0,5799999833106995
Questo ovviamente è un problema di arrotondamento, ma se avessi bisogno di verificare quale valore è stato scelto otterresti un risultato errato.
if( test1 == value ){
// do something
}
tuttavia, se utilizzi MIN( A, B ) o MAX( A, B ) funzionerebbe come previsto.
Ho pensato che valesse la pena condividerlo
Grazie
Soluzione
Questo non ha nulla a che fare con un bug fminf
O fmaxf
.C'è un bug nel tuo codice.
Sui sistemi a 64 bit, CGFloat
è definito come double
, ma stai utilizzando il file fmaxf
funzione, su cui opera float
(non double
), che fa sì che i suoi argomenti vengano arrotondati alla precisione singola, modificando così il valore.Non farlo.
Sui sistemi a 32 bit, ciò non accade perché CGFloat
è definito come float
, corrispondente all'argomento e al tipo restituito di fmaxf
;non si verifica alcun arrotondamento.
Invece, includi <tgmath.h>
e utilizzare fmax
senza il f
suffisso o uso float
invece di CGFloat
.