Kod krytyczny pod względem wydajności float.IsNaN
może być zbyt wolny, ponieważ dotyczy jednostki FPU. W tym przypadku można użyć binarny czek maski (według IEEE 754 specification) następująco:
public static unsafe bool IsNaN (float f)
{
int binary = *(int*)(&f);
return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0);
}
To jest 5 razy szybciej niż float.IsNaN
. Zastanawiam się tylko, dlaczego Microsoft nie wdrożył w ten sposób IsNaN
. Jeśli wolisz nie przy użyciu niebezpieczny kod nadal można korzystać z Unią jak strukturę:
[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);
}
to jeszcze 3 razy szybciej niż IsNaN
.
To jest niepokojące :) – JaredPar
Następnie NaN! = NaN? – alan2here
To jestNaN() nie IsNaN() – AntonioCS