我有一个函数获取样本(一个std::vector<double>
)作为输入并计算样本的平均值:处理空输入向量情况的最佳方法是什么?返回NaN还是抛出异常?
我的第一个想法是在这个片段抛出一个异常,如:
double average(const std::vector<double>& sample)
{
size_t sz = sample.size();
if (sz==0) throw std::exception("unexpected empty vector");
double acc = 0;
for (size_t i=0; i<sz; ++i) acc += sample[i];
return acc/sz;
}
但我认为另一个解决办法是回到楠:
double average(const std::vector<double>& sample)
{
size_t sz = sample.size();
if (sz==0) return std::numeric_limits<double>::quiet_NaN();
double acc = 0;
for (size_t i=0; i<sz; ++i) acc += sample[i];
return acc/sz;
}
我喜欢的异常,因为它显示了问题发生的时候,如果我在一个长计算的最终结果中得到一个NaN,我将更难以理解NaN的出生地点。无论如何,NaN我喜欢返回一个“特殊”双倍的可能性,以表示意外事件发生。
是否有任何其他方式来应付空载体? 谢谢。
2提示:通过引用(&)传递向量并使用Kahan求和。 – ybungalobill
@ybungalobill +1第一个提示(我忘了&我通常写)。对于第二个提示,我有一个问题:你有没有看到真正的代码行为不正常,并用Kahan求和来解决问题? –
定义“行为不端”。浮点计算不会“不正常”(通常),它们只是逐渐放宽精度。是的,将100个数字相加是很常见的,并且可以从无限精度的结果中获得足够的结果,以便在输出中看到它。 – ybungalobill