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.

teepusink
quelle
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).

Stephen Canon
quelle
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.

Futter
quelle
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.

Aswathy Bose
quelle
2

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

Zhao
quelle