嗨,我有一个功能,只在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
}
现在它正在运作。值!=值仍然有效吗?我错过了什么......我只是不明白为什么老方法不起作用?
答案 0 :(得分:3)
如果是NaN,那么value!=value
将成立。但如果它不是NaN,则无法保证value!=value
将为假。
答案 1 :(得分:-1)
比较浮点值是不直观的。每个浮点值仅包含一个近似表示(尽管某些值是精确的),这受先前的计算和处理的影响。根据FPU模式和值处理,即使HUGE_VAL
也可能会失去精度。
相反,使用epsilon comparison比较浮点值。 is_nan()
函数是检查特殊位的浮点值的精确方法,它将其指定为非数字的特殊表示。