Ziel-C - Float-Prüfung auf Nan


77

Ich habe eine Variable ( float slope), die beim Ausdrucken manchmal den Wert nan hat, da manchmal eine Division durch 0 auftritt.

Ich versuche ein Wenn-Sonst zu tun, wenn das passiert. Wie kann ich das machen? if (slope == nan)scheint nicht zu funktionieren.


3
mögliches Duplikat von isNan in Ziel c
Jorge Ferreira

1
Ziel-C für Float oder Double : isnan(slope); Swift für floatPointType:slope.isNaN
Cœur

Antworten:


205

Zwei Möglichkeiten, die mehr oder weniger gleichwertig sind:

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

Oder

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

( man isnangibt Ihnen weitere Informationen, oder Sie können alles darüber im C-Standard lesen)

Alternativ können Sie feststellen, dass der Nenner vor dem Teilen Null ist (oder verwenden, atan2wenn Sie nur atanauf der Steigung verwenden, anstatt eine andere Berechnung durchzuführen).


94
Wenn ich jemals auf if (foo != foo)einen Code stoßen würde, würde ich eine sehr hörbare "WTF" ausstoßen. isnanscheint eine weitaus klarere und lesbarere Methode zu sein.
Alex Wayne

5
@Squeegy: Für jemanden, der mit Gleitkommazahlen vertraut ist, lesen sie dasselbe. Für jemanden, der es nicht ist, isnanist das viel klarer.
Stephen Canon

2
@ AndrewHeinlein: nicht genau. Es wird erweitert auf x != x, es sei denn, Sie kompilieren mit -ffast-math oder ähnlichem. In diesem Fall wird es auf einen Aufruf von __isnanfoder erweitert __isnand(da x != xes unter -ffast-math nicht ordnungsgemäß funktioniert). Daher ist es im Allgemeinen am besten zu verwenden isnan.
Stephen Canon

1
Aber was macht __isnanfund __isnanderweitert?
Andy

1
@IulianOnofrei, weil NaN so definiert ist, dass es nichts entspricht, einschließlich NaN.
Stephen Canon

35

Nichts ist gleich NaN- einschließlich sich NaNselbst. Also überprüfe x != x.


5
 if(isnan(slope)) {

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

Hoffe das wird für dich funktionieren.


2

In Swift müssen Sie slope.isNaNüberprüfen, ob es sich um eine NaN handelt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.