【发布时间】:2011-11-09 17:41:28
【问题描述】:
我有一个函数,它获取样本(std::vector<double>)作为输入并计算样本的平均值:处理空输入向量情况的最佳方法是什么?
我的第一个想法是在这个 sn-p 中抛出一个异常:
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;
}
但我认为另一种解决方案可能是返回 NaN:
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 +1 第一个提示(我忘了 & 我通常写的)。对于第二个技巧,我有一个问题:您是否见过真正的代码行为不端并使用 Kahan 求和解决问题?
-
定义“行为不端”。浮点计算不会“行为不端”(通常),它们只是逐渐降低精度。是的,将 100 个数字相加并得到一个远离无限精度的结果是很常见的,因此它可以在输出中看到。
-
我对与数值分析相关的直接经验(或“战争故事”)很好奇,您正在编写的代码是否发生过这种情况? “足够远”是多少?
-
@uvts_cvs:作为一个新问题提出这个问题(带有浮点标签)。
标签: c++ statistics numeric nan