嗨,我有一个函数,它只在发布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()
函数是检查特殊位的浮点值的精确方法,这些特殊位将其指定为非数字的特殊表示。