IsNan vs value!= VS2010的64bit值

时间:2012-02-09 00:53:04

标签: c++ visual-studio-2010 64-bit double

嗨,我有一个功能,只在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
}

现在它正在运作。值!=值仍然有效吗?我错过了什么......我只是不明白为什么老方法不起作用?

2 个答案:

答案 0 :(得分:3)

如果是NaN,那么value!=value将成立。但如果它不是NaN,则无法保证value!=value将为假。

答案 1 :(得分:-1)

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

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