6
votes

Comment comparer cgfloat dans XctestCase?

Je ne peux pas comprendre cela du tout. Quel est le problème ici?

J'ai essayé de taper 1.0 , 1.0f , (cgfloat) 1.0 et (CGFLOAT) (2.0 - 1.0) . Chaque fois la même erreur.

capture d'écran à partir de xcode


0 commentaires

3 Réponses :


0
votes

J'ai changé en xxx

et il semble fonctionner juste bien maintenant ...


0 commentaires

6
votes

La partie fractionnée de vos numéros, 0,9, ne peut pas être représentée avec précision par un flotteur. Certains arrondis se produiront, et c'est probablement la raison de l'échec.

0,9 = (1/2) + (1/4) + (1/8) + (1/64) + (1/128) + (1/1024) + (1/2048) + (1 / 16384) + (1/32768) + (1/262144) etc etc = 0,89999978005, etc.

Les fractions qui regardent autour de l'œil humain peuvent ne pas être rondes dans le système binaire.

0.5 est un nombre rond pour la CPU = (1/2).

0,75 est rond pour la CPU = (1/2) + (1/4).

Même 0,9072265625 est rond ((1/2) + (1/4) + (1/4) + (1/32) + (1/1024))

mais pas 0.9 ou 0,1. Pas même 0.2 :)

Edit: et, bien sûr, utilisez un epsilon pour comparer des flotteurs.


0 commentaires

18
votes

Je recommanderais d'utiliser flt_epsilon pour ceci:

XCTASSERTIQUACECURACACIE (MOV.LASTDELTA, 0.0F, FLT_EPSILON, @ "");

sauf si vous avez une raison d'avoir besoin d'un Epsilon plus grand.


0 commentaires