2010-08-12 4 views
71

J'ai une variable (float slope) qui aura parfois une valeur de nan lorsqu'il est imprimé car une division par 0 arrive parfois. J'essaie de faire un if-else pour quand cela arrive. Comment puis je faire ça? if (slope == nan) ne semble pas fonctionner.Objectif C - contrôle flottant pour nan

+3

duplication possible de [isNan dans l'objectif c] (http://stackoverflow.com/questions/2109257/isnan-in-objective-c) –

+1

Objective-C pour float ou double: 'isnan (pente)'; Swift pour floatingPointType: 'slope.isNaN' –

Répondre

188

Deux façons, plus ou moins équivalentes:

if (slope != slope) { 
    // handle nan here 
} 

Ou

#include <math.h> 
... 
if (isnan(slope)) { 
    // handle nan here 
} 

(man isnan vous donnera plus d'informations, ou vous pouvez lire tout cela dans la norme C)

Vous pouvez également détecter que le dénominateur est égal à zéro avant d'effectuer la division (ou utiliser atan2 si vous souhaitez utiliser atan sur la pente au lieu de faire un autre calcul).

+87

Si jamais je tombais sur' if (foo! = Foo) 'dans un code je laisserais sortir un" WTF "très audible. 'isnan' semble être une méthode * loin * plus claire et plus lisible. –

+5

@Squeegy: à quelqu'un qui est familier avec le point flottant, ils lisent la même chose. Pour quelqu'un qui n'est pas, oui, 'isnan' est beaucoup plus clair. –

+3

'slope! = Slope' est brillant. Merci! – JohnK

32

Rien n'est égal à NaN - incluant NaN lui-même. Donc, vérifiez x != x.

+3

Merci pour l'explication! – cdavidyoung

4
if(isnan(slope)) { 

    yourtextfield.text = @""; 
    //so textfield value will be empty string if floatvalue is nan 
} 
else 
{ 
    yourtextfield.text = [NSString stringWithFormat:@"%.1f",slope]; 
} 

Espérons que cela fonctionnera pour vous.

1

Dans Swift, vous devez faire slope.isNaN pour vérifier s'il s'agit d'un NaN.