En el código de rendimiento crítico float.IsNaN
podría ser demasiado lento porque involucra FPU. En ese caso se puede utilizar cheque máscara binaria (de acuerdo con IEEE 754 specification) de la siguiente manera:
public static unsafe bool IsNaN (float f)
{
int binary = *(int*)(&f);
return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0);
}
Es 5 veces más rápido que float.IsNaN
. Me pregunto por qué Microsoft no implementó IsNaN
de esa manera. Si prefiere no usar código no seguro todavía se puede utilizar la unión-como la estructura:
[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
.
Eso es perturbador :) – JaredPar
Entonces NaN! = NaN? – alan2here
Es isNaN() no IsNaN() – AntonioCS