Bug dans fminf et fmaxf sur les processeurs iOS 64 bits
Question
Je suis tombé sur un bug avec les processeurs 64 bits que je souhaitais partager.
CGFloat test1 = 0.58;
CGFloat test2 = 0.40;
CGFloat value;
value = fmaxf( test1, test2 );
Le résultat serait :
valeur = 0,5799999833106995
Il s'agit évidemment d'un problème d'arrondi, mais si vous deviez vérifier quelle valeur a été sélectionnée, vous obtiendrez un résultat erroné.
if( test1 == value ){
// do something
}
cependant, si vous utilisez MIN( A, B ) ou MAX( A, B ), cela fonctionnera comme prévu.
Je pensais que cela valait la peine d'être partagé
Merci
La solution
Cela n'a rien à voir avec un bug fminf
ou fmaxf
.Il y a un bug dans votre code.
Sur les systèmes 64 bits, CGFloat
est typé en double
, mais vous utilisez le fmaxf
fonction, qui fonctionne sur float
(pas double
), ce qui provoque l'arrondi de ses arguments en simple précision, modifiant ainsi la valeur.Ne fais pas ça.
Sur les systèmes 32 bits, cela ne se produit pas car CGFloat
est typé en float
, correspondant à l'argument et au type de retour de fmaxf
;aucun arrondi n’a lieu.
Au lieu de cela, incluez <tgmath.h>
et utilise fmax
sans le f
suffixe, ou utiliser float
au lieu de CGFloat
.