c++ - 空序列的算术平均值是多少?

标签 c++ math floating-point nan

免责声明:不,我没有找到任何明显的答案,与我的预期相反!

在寻找代码示例时。算术平均值,我可以通过谷歌找到的前几个例子似乎被定义为空序列生成 0.0 的平均值。 (例如 herehere ...)

然而,查看维基百科,Arithmetic mean被定义为空序列将产生 0.0/0 --

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

——所以,可能,that is NaN一般情况下。

因此,如果我编写一个计算一组浮点值的算术平均值的实用函数,我应该在一般情况下:

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

最佳答案

没有明显的答案,因为处理取决于您希望如何通知调用代码错误。 (或者即使您想将此解释为“错误”。)

有些库/程序真的不喜欢引发异常,所以一切都使用信号值。在这种情况下,返回 NaN(因为表达式的值在技术上是未定义的)是一个合理的选择。

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

但请注意,如果您为空序列的均值返回 NaN,您就会给调用代码带来负担,他们需要检查函数的返回值以确保它不是 NaN - 在返回时立即或以后。这是一个很容易忽略的要求,具体取决于您检查返回值时的要求。

因此,其他库/程序认为错误条件应该是“嘈杂的”——如果你将一个空序列传递给一个正在寻找序列均值的函数,那么你显然做错了什么,你应该清楚地知道你搞砸了。

当然,如果可以引发异常,则需要对其进行处理,但您可以在更高级别上执行此操作,可能集中在更有意义的点上。根据您的程序,这可能比仔细检查返回值更容易或更符合标准错误处理方案。

其他人会争辩说,您的函数应该对错误具有鲁棒性。为了获得最大的稳健性,您可能不应该使用 NaN 或异常 - 您需要选择一个“有意义”的实际数字作为空列表的平均值。

哪个值将是高度特定于您的用例。例如,如果您的序列是差异/错误列表,您可能会返回 0。如果您正在平均测试分数(得分为 0-100),您可能希望为空列表返回 100 ...或 0,取决于您对“起始”分数的理念是什么。这完全取决于返回值的用途。

鉴于此“中性”值的值将根据具体用例变化很大,您可能希望在两个函数中实际实现它 - 一个返回 NaN 或引发异常的通用函数,另一个包装通用函数并识别“错误”情况。这样,您可以拥有多个版本,每个版本都有不同的“默认”情况。 -- 或者如果这是你经常做的事情,你甚至可以将“默认”值作为你可以传递的参数。

同样,这个问题没有单一的答案:空序列的平均值是不确定的。你想如何处理它取决于计算结果的用途:只是显示,还是进一步计算?空列表应该是异常(exception),还是应该安静地处理?您想在特殊情况发生时处理它,还是想提升/推迟错误处理?

关于c++ - 空序列的算术平均值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39706777/

相关文章:

perl - 如何在 Perl 中对 float 进行四舍五入?

math - float 学有问题吗?

c++ - 为什么 clock() 返回 1.84467e+13?

c++ - 如何在 lambda 本身中获取 C++ lambda 函数的地址?

Python socket 接收和存储数据

java - 改进以更快的方式分解的代码?

c# - 使用 x, y 坐标计算角度

algorithm - 缩短 14 位以上的大数字

c++ - 复制构造函数+浅复制和深复制

c++ - 不同编译器上 double 的不同行为