什么是空序列的算术平均值?

免责声明:不,我没有find任何明显的答案,违背了我的预期!

当寻找代码示例Wrt。 算术平均值,我可以通过Googlefind的前几个例子似乎被定义为空序列产生0.0的平均值。 (例如, 在这里和这里 …)

然而,看维基百科, 算术平均值是这样定义的,即一个空序列将产生0.0 / 0

  A = 1/n ∑[i=1 -> n](a[i]) 

– 所以,一般情况下可能是NaN 。

所以如果我写一个效用函数来计算一组浮点值的算术平均值,那么我应该在一般情况下:

  • 为空序列返回0. .
  • 为空序列返回(Q)NaN
  • 在空序列的情况下“抛出exception”?

没有一个明显的答案,因为处理取决于你想如何通知错误的调用代码。 (或者即使你想把这个解释为一个“错误”)。

有些图书馆/程序实际上不喜欢引发exception,所以所有的信号值都要做。 在这种情况下,返回NaN(因为expression式的值在技术上是不确定的)是一个合理的select。

如果您想通过多个其他计算“静静地”将价值转移,您可能还想返回NaN。 (依靠NaN与其他任何东西结合的行为是“默默”NaN)

但是请注意,如果返回NaN表示空序列的平均值,那么调用代码的负担就是他们需要检查函数的返回值,以确保它不是NaN – 要么立即返回,要么立即返回。 这是一个很容易错过的要求,这取决于你在检查返回值时的苛刻程度。

正因为如此,其他库/程序认为错误条件应该是“噪声”的观点 – 如果你将一个空序列传递给一个find序列的平均值的函数,那么你显然做了一个大错误的事情,它应该你清楚地知道你已经搞砸了。

当然,如果可以提出例外,他们需要处理,但是你可以在更高的层次上进行,有可能集中在更有意义的地方。 根据您的程序,这可能会比标准error handlingscheme更容易或更多,而不是双重检查返回值。

其他人会争辩说,你的function应该是强大的错误。 为了获得最大的健壮性,你可能不应该使用NaN或者一个exception – 你需要select一个“有意义”的实际数字作为一个空列表的平均值。

哪个价值将是非常具体到您的使用情况。 例如,如果您的序列是差异/错误列表,则可能返回0.如果您平均testing分数(得分为0-100),则可能需要为空列表返回100 …或0,取决于你的“开始”分数的哲学是什么。 这一切都取决于返回值将被用于什么。

考虑到这个“中性”值的价值将根据确切的用例而高度变化,您可能需要实际将其实现为两个函数 – 一个返回NaN或引发exception的一般函数,另一个函数包装一般function,并认识到“错误”的情况。 这样你可以有多个版本,每个版本都有不同的“默认”情况。 – 或者如果这是你做了很多的事情,你甚至可以把“默认”值作为你可以传递的参数。

再一次,这个问题没有一个单一的答案:一个空序列的平均值是未定义的。 你想如何处理它取决于计算的结果是什么:只显示或进一步计算? 一个空的名单应该是例外的,还是应该安静地处理? 您是否想要在特定情况下处理特殊情况,或者是否要提升/推迟error handling?

在math上,由于分母是零,因此不确定。

由于在C ++中未定义整数除零的行为,因此如果使用整型types,则会引发exception。

如果你在IEEE754浮点工作,那么返回NaN,因为分子也是零。 (如果分子是正值,则返回+ Inf,如果分子是负值,则返回-Inf)。

我build议保持与0.0除0相同的行为, 不pipe它是什么 。 的确,人们可以采用“如果”的规定。 这样,您就可以与其他操作保持一致,而且您不必亲自做出决定。

(你甚至可以通过返回0.0 / 0来实现,但是编译器可能会以意想不到的方式优化它。)

我喜欢防守编码,所以我会抛出一个exception。 你可以将它作为一个特定的exception(如empty_sequence_exception)或一个除0,因为除法器是序列长度为0。

0.0是有争议的,因为没有数据(序列)。

正确的答案是空序列的算术平均值没有意义,因为空序列本质上是一个空集。 什么都没有意义。 零当然不是一个正确的答案。 说一个序列有3个成员,1,0和-1,或者是一个全零的序列。 这两者的平均值将为零,不应与空序列混淆。