Objective-C - comprobación de flotación para nan

78

Tengo una variable ( float slope) que a veces tendrá un valor de nan cuando se imprima, ya que a veces ocurre una división entre 0.

Estoy tratando de hacer un if-else para cuando eso suceda. ¿Cómo puedo hacer eso? if (slope == nan)no parece funcionar.

teepusink
fuente
3
posible duplicado de isNan en el objetivo c
Jorge Ferreira
1
Objective-C para flotar o doble isnan(slope):; Swift para floatingPointType:slope.isNaN
Cœur

Respuestas:

207

Dos formas, que son más o menos equivalentes:

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

O

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

( man isnanle dará más información, o puede leerlo todo en el estándar C)

Alternativamente, puede detectar que el denominador es cero antes de hacer la división (o usarlo atan2si solo va a terminar usando atanen la pendiente en lugar de hacer algún otro cálculo).

Stephen Canon
fuente
94
Si alguna vez me cruzara if (foo != foo)con algún código, soltaría un "WTF" muy audible. isnanparece un método mucho más claro y legible.
Alex Wayne
5
@Squeegy: para alguien que esté familiarizado con el punto flotante, leen lo mismo. Para alguien que no lo es, sí, isnanes mucho más claro.
Stephen Canon
2
@AndrewHeinlein: no exactamente. Se expande a x != x, a menos que esté compilando con -ffast-math o similar, en cuyo caso se expande a una llamada a __isnanfo __isnand(porque x != xno funcionará correctamente bajo -ffast-math). Por lo que generalmente es mejor usarlo isnan.
Stephen Canon
1
Pero, ¿a qué se expande __isnanfy se __isnandexpande?
Andy
1
@IulianOnofrei porque NaN se define como no igual a nada, incluido NaN.
Stephen Canon
35

Nada es igual a NaN... incluyéndose a NaNsí mismo. Así que compruebe x != x.

Arrojar
fuente
5
 if(isnan(slope)) {

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

Espero que esto funcione para usted.

Aswathy Bose
fuente
2

En Swift, debe slope.isNaNverificar si es un NaN.

Zhao
fuente