我有一个浮点值设置为NaN(在监视窗口中看到),但我无法弄清楚如何在代码中检测到:
if (fValue == float.NaN) // returns false even though fValue is NaN
{
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*lla 83
你想要的float.IsNaN(...).NaN无论float的值是什么,比较总是返回false.这是浮点的怪癖之一.
这意味着你可以这样做:
if (f1 != f1) { // This conditional will be true if f1 is NaN.
Run Code Online (Sandbox Code Playgroud)
事实上,这正是IsNaN()的工作原理.
Dmi*_*kov 11
性能关键代码float.IsNaN可能太慢,因为它涉及FPU.在这种情况下,您可以使用二进制掩码检查(根据IEEE 754规范)如下:
public static unsafe bool IsNaN (float f)
{
int binary = *(int*)(&f);
return ((binary & 0x7F800000) == 0x7F800000) && ((binary & 0x007FFFFF) != 0);
}
Run Code Online (Sandbox Code Playgroud)
它比快5倍float.IsNaN.我只是想知道为什么微软没有IsNaN以这种方式实施.如果您不想使用不安全的代码,您仍然可以使用类似union的结构:
[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);
}
Run Code Online (Sandbox Code Playgroud)
它仍然比它快3倍IsNaN.