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