Aquí podría ser tu PUBLICIDAD


¿Cómo puedo comparar un flotante con NaN si las comparaciones con NaN siempre devuelven falso?

votos
34

Tengo un valor flotante establecido en NaN (visto en la ventana de observación), pero no puedo encontrar la manera de detectarlo en el código:

if (fValue == float.NaN) // returns false even though fValue is NaN
{
}
Publicado el 12/03/2009 a las 15:55
fuente por usuario Anthony Brien
En otros idiomas...        العربية       

5 respuestas

votos
73

Que desea float.IsNaN(...). Las comparaciones NaNsiempre devuelven falso, sin importar el valor del flotador. Es una de las peculiaridades de los puntos flotantes.

Eso significa que puedes hacer esto:

if (f1 != f1) { // This conditional will be true if f1 is NaN.

De hecho, así es exactamente como funciona IsNaN ().

Respondida el 12/03/2009 a las 03:56
fuente por usuario John Feminella


Aquí podría ser tu PUBLICIDAD


votos
29

Prueba esto:

if (float.IsNaN(fValue))
{
}
Respondida el 12/03/2009 a las 03:56
fuente por usuario Jakob Christensen

votos
12

En código de rendimiento crítico float.IsNaNpodría ser demasiado lento, ya que implica la FPU. En ese caso se puede utilizar el corrector máscara binaria (según IEEE 754 especificación ) de la siguiente manera:

public static unsafe bool IsNaN (float f)
{
    int binary = *(int*)(&f);
    return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0);
}

Se encuentra a 5 veces más rápido que float.IsNaN. Me pregunto por qué Microsoft no ha aplicado IsNaNde tal manera. Si prefiere no usar código no seguro todavía se puede utilizar la estructura de unión similar a:

[StructLayout (LayoutKind.Explicit)]
struct FloatUnion
{
    [FieldOffset (0)]
    public float value;

    [FieldOffset (0)]
    public int binary;
}

public static bool IsNaN (float f)
{
    FloatUnion union = new FloatUnion ();
    union.value = f;

    return ((union.binary & 0x7F800000) == 0x7F800000) && ((union.binary & 0x007FFFFF) != 0);
}

Todavía es 3 veces más rápido que IsNaN.

Respondida el 20/02/2012 a las 11:56
fuente por usuario Dmitry Fedorkov

votos
7
if(float.isNaN(fValue))
{
}
Respondida el 12/03/2009 a las 03:57
fuente por usuario Jeff Mc

votos
2
if (fValue.CompareTo(float.NaN) == 0)

Nota: Lo sé, el hilo está muerto.

Respondida el 27/03/2011 a las 04:38
fuente por usuario Tipx