In performance-kritischen Code float.IsNaN
könnte zu langsam sein, weil es FPU beteiligt. In diesem Fall können Sie binäre Maskenprüfung (nach IEEE 754 specification) wie folgt verwendet werden:
public static unsafe bool IsNaN (float f)
{
int binary = *(int*)(&f);
return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0);
}
Es ist 5-mal schneller als float.IsNaN
. Ich frage mich nur, warum Microsoft IsNaN
nicht so implementiert hat. Wenn Sie es vorziehen, nicht zu einer unsicheren Code können Sie immer noch gewerkschaftsähnliche Struktur verwenden:
[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);
}
Es ist immer noch 3-mal schneller als IsNaN
.
Das ist störend :) – JaredPar
Dann NaN! = NaN? – alan2here
Es ist isNaN() nicht IsNaN() – AntonioCS