IsNan vs价值!=64位的VS2010上的值



嗨,我有一个函数,它只在发布64位版本构建时给我带来奇怪的行为。32位适用于所有情况,64位适用于调试。不管怎样,在原始代码中,值的值是一个实数,比如5或100等:

static void 
Foo(char **pInOut, unsigned int key, double value)
{
if (value == -HUGE_VAL)
    return;
if (value != value)
    return;
// Does stuff that isn't happening
}

我在玩,我替换了值!=值带有:

static void 
Foo(char **pInOut, unsigned int key, double value)
{
if (value == -HUGE_VAL)
    return;
if (_isnan(value))
    return;
// Does stuff that happens now
}

现在它开始工作了。value!=值仍然有效,对吗?我是不是错过了什么。。。我就是不明白为什么老办法行不通?

如果它是一个NaN,那么value!=value将为true。但如果它不是NaN,就不能保证value!=value是假的。

比较浮点值是不直观的。每个浮点值仅包含一个受先前计算和处理影响的近似表示(尽管有些值是精确的)。根据FPU模式和值处理,即使HUGE_VAL也可能遭受精度损失。

相反,使用epsilon比较来比较浮点值。is_nan()函数是检查特殊位的浮点值的精确方法,这些特殊位将其指定为非数字的特殊表示。

最新更新