6

我们有定期采集数据的时间流,但在某些时候没有采集数据,因此我们在该点将 QNAN 放置在数组中。唯一的问题是,每当我们对数据进行任何统计时,每次访问某个位置时,我们都必须检查它是否不是 NAN。所以我们的平均程序看起来像

int n = 0;
double sum = 0;
for(int i = 0; i < SIZE; i++)
{
    if(data[i] == data[i])
    {
        sum += data[i];
        n++;
    }
}

我们可能总是需要计算 NAN,但如果有一种说法,如果你将一个无效值添加到一个有效数字,那么有效数字保持不变,那就太好了。

我不确定是否有更好的方法可以做到这一点,但想检查一下。谢谢,詹姆斯

4

4 回答 4

7

你不能用 NAN 做你要求的事情,因为 NAN 上的算术不能满足你的需要。包含 NAN 操作数的加法的结果是 NAN。

您正在寻找一个附加的身份。这意味着您需要在数组中输入零。现在,如果您这样做,那么您将不得不在其他地方跟踪哪些元素无效并相应地处理。但是,如果您希望能够对一组值求和,并且让某些值没有贡献,那么您唯一的选择就是将这些值设为零。

坦率地说,我认为您当前的解决方案与您将获得的一样好,以使用 std::isnan() 来检查 NAN 为模。

于 2013-11-12T10:34:58.663 回答
3

检查 NaN 的更好方法是std::isnan函数。

确定给定的浮点数 arg 是否不是数字 (NaN)。

于 2013-11-12T10:23:26.967 回答
1

你描述了oneliner sum += std::isnan(data[i]) ? 0 : data[i];,它并没有比这更容易。

于 2013-11-12T12:24:18.657 回答
0

您可以使用std::isnan在其他检查之前检查值。

于 2013-11-12T10:23:52.567 回答