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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top