Cum pot compara un flotor la NaN în cazul în comparații cu NaN reveni întotdeauna false?

voturi
34

Am o valoare float setată la NaN (văzută în fereastra Watch), dar nu pot da seama cum de a detecta faptul că în codul:

if (fValue == float.NaN) // returns false even though fValue is NaN
{
}
Întrebat 12/03/2009 la 13:55
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
29

Incearca asta:

if (float.IsNaN(fValue))
{
}
Publicat 12/03/2009 la 13:56
sursa de către utilizator

voturi
73

Vrei float.IsNaN(...). Comparațiile să se NaNîntoarcă întotdeauna false, indiferent de ceea ce este valoarea flotorului. Este una dintre ciudățeniile de puncte plutitoare.

Asta înseamnă că puteți face acest lucru:

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

De fapt, exact cum functioneaza IsNaN ().

Publicat 12/03/2009 la 13:56
sursa de către utilizator

voturi
7
if(float.isNaN(fValue))
{
}
Publicat 12/03/2009 la 13:57
sursa de către utilizator

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

Notă: Știu, firul este mort.

Publicat 27/03/2011 la 01:38
sursa de către utilizator

voturi
12

În codul performanță critice float.IsNaNar putea fi prea lent , deoarece implică FPU. În acest caz , puteți utiliza masca de verificare binar (conform IEEE 754 caietul de sarcini ) , după cum urmează:

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

Acesta este de 5 ori mai rapid decât float.IsNaN. Mă întreb doar de ce Microsoft nu a pus în aplicare IsNaNîn așa fel. Dacă preferați să nu utilizați cod nesigur pe care încă mai pot folosi structura uniunilor cum ar fi:

[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);
}

Este încă de 3 ori mai repede decât IsNaN.

Publicat 20/02/2012 la 08:56
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more