C++中如何对含NaN的double向量求和并忽略NaN?
C++向量求和忽略NaN的实现方案
关于std::accumulate的使用
直接用默认的std::accumulate不行——因为NaN和任何数值相加的结果都是NaN,只要向量里存在NaN,默认累加的结果就会是NaN。但你可以通过自定义累加规则,让accumulate忽略NaN值:
#include <vector> #include <numeric> #include <cmath> double sum_ignore_nan(const std::vector<double>& vec) { return std::accumulate(vec.begin(), vec.end(), 0.0, [](double total, double num) { // 仅当当前数值不是NaN时,才累加到总和 return std::isnan(num) ? total : total + num; }); }
这段代码给accumulate传了一个lambda表达式作为第四个参数,替代默认的加法操作,实现了对NaN的过滤。
用for循环实现的方案
当然可以用for循环实现,逻辑更直观:初始化一个总和变量,遍历向量的每个元素,判断不是NaN就加到总和里:
#include <vector> #include <cmath> double sum_ignore_nan(const std::vector<double>& vec) { double total = 0.0; for (double num : vec) { if (!std::isnan(num)) { total += num; } } return total; }
关于NaN的判断
和Python类似,C里不能用==判断NaN——因为NaN的特性是不等于任何值(包括它自己)。正确的做法是使用标准库<cmath>里的std::isnan()函数,这个函数在C11及以后的标准中可用,调用前记得包含头文件<cmath>。
比如你不能写if (num == std::nan("")),而必须写if (std::isnan(num))来判断某个double值是否为NaN。
内容的提问来源于stack exchange,提问作者Jinx
相关产品推荐
相关产品推荐

