当前位置:  开发笔记 > 编程语言 > 正文

如果与NaN的比较总是返回false,我如何比较浮点数到NaN?

如何解决《如果与NaN的比较总是返回false,我如何比较浮点数到NaN?》经验,为你挑选了4个好方法。

我有一个浮点值设置为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()的工作原理.



1> John Feminel..:

你想要的float.IsNaN(...).NaN无论float的值是什么,比较总是返回false.这是浮点的怪癖之一.

这意味着你可以这样做:

if (f1 != f1) { // This conditional will be true if f1 is NaN.

事实上,这正是IsNaN()的工作原理.


那令人不安:)
@AntonioCS:不,这是[`IsNaN`](http://msdn.microsoft.com/en-us/library/system.single.isnan.aspx),资本"我".我想你在考虑Javascript的`isNaN`.
那么NaN!= NaN?

2> Jakob Christ..:

试试这个:

if (float.IsNaN(fValue))
{
}



3> Dmitry Fedor..:

性能关键代码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.


浮点_data结构与平台无关,但字节顺序不是.
二进制比较是否真的依赖于字节序?二进制掩码中的字节顺序与int值中的字节顺序相同.无论如何,如果微软决定对无穷大使用这种检查,他们可以使用相同的方式进行NaN检查.

4> Jeff Mc..:
if(float.isNaN(fValue))
{
}

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有