2010-08-12 22 views
71

mam zmienną (float slope), które czasami mają wartość nan gdy drukowany ponieważ podzielenie przez 0 czasami zdarza.Cel C - pływak sprawdzania nan

Próbuję zrobić if-else, gdy to się stanie. Jak mogę to zrobić? if (slope == nan) wydaje się nie działać.

+3

możliwy duplikat [isNan w obiektywnym c] (http://stackoverflow.com/questions/2109257/isnan-in-objective-c) –

+1

Objective-C dla float lub double: 'isnan (slope)'; Swift dla floatingPointType: 'slope.isNaN' –

Odpowiedz

188

Dwa sposoby, które są mniej lub bardziej równoważne:

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

Albo

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

(man isnan daje więcej informacji, można też przeczytać o tym w standardzie C)

Alternatywnie, można wykryć, że mianownik jest zerem, zanim zrobisz przepaści (lub użyć atan2 jeśli tylko skończy się za pomocą atan na zboczu zamiast wykonywać inne obliczenia).

+87

Gdybym kiedykolwiek natknął się na' if (foo! = Foo) 'w jakimś kodzie, wypuściłbym bardzo słyszalny" WTF ". 'isnan' wydaje się być * zdecydowanie * bardziej czytelną i czytelną metodą. –

+5

@Squeegy: do kogoś, kto zna zmiennoprzecinkowe, oni czytają to samo. Dla kogoś, kto nie jest, tak, 'isnan' jest o wiele jaśniejszy. –

+3

'slope! = Slope' is brilliant. Dzięki! – JohnK

32

Nic nie jest równe NaN - w tym sam NaN. Sprawdź więc x != x.

+3

Dzięki za wyjaśnienie! – 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]; 
} 

Mam nadzieję, że to zadziała.

1

w Swift, trzeba zrobić slope.isNaN by sprawdzić, czy jest to NaN.