Mar*_* Ba 36 c++ math floating-point nan
免责声明:不,我没有找到任何明显的答案,与我的预期相反!
在寻找代码示例时.算术平均值,我可以通过谷歌调出的前几个例子似乎被定义为空序列产生的平均值0.0.(例如,这里和这里 ......)
然而,看一下维基百科,算术平均值被定义为空序列会产生0.0 / 0-
A = 1/n ?[i=1 -> n](a[i])
Run Code Online (Sandbox Code Playgroud)
因此,如果我编写一个计算一组浮点值的算术平均值的效用函数,我应该在一般情况下:
0.空序列?(Q)NaN空序列?R.M*_*.M. 35
没有明显的答案,因为处理取决于您希望如何通知调用代码的错误.(或者即使您想将此解释为"错误".)
有些库/程序真的不喜欢引发异常,所以用信号值做所有事情.在这种情况下,返回NaN(因为表达式的值在技术上是未定义的)是一个合理的选择.
如果您希望"静默地"通过多个其他计算将值向前移动,您可能还想返回NaN.(依赖于NaN与其他任何东西相结合的行为是"默默地"NaN.)
但是请注意,如果你为一个空序列的平均值返回NaN,你就需要调用函数的代码来检查函数的返回值,以确保它不是NaN - 无论是在返回时还是稍后.这是一个很容易错过的要求,具体取决于您检查返回值的严谨程度.
因此,其他库/程序认为错误条件应该是"嘈杂" - 如果你将一个空序列传递给一个找到序列均值的函数,那么你显然做了一些重大错误,它应该你已经搞清楚了,你已经搞砸了.
当然,如果可以引发异常,则需要处理它们,但是您可以在更高级别执行此操作,可能集中在更有意义的地方.根据您的程序,这可能比标准错误处理方案更容易或更多,而不是重复检查返回值.
其他人会争辩说你的函数应该对错误很有用.为了获得最大的稳健性,您可能不应该使用NaN或异常 - 您需要选择一个"有意义"的实际数字作为空列表平均值的值.
哪个值对您的用例非常具体.例如,如果您的序列是差异/错误列表,则可能返回0.如果您对测试分数求平均值(得分为0-100),您可能希望为空列表返回100 ...或0,取决于你的"起点"得分的理念.这一切都取决于返回值将用于什么.
鉴于这个"中性"值的值将根据确切的用例高度变化,你可能想要在两个函数中实际实现它 - 一个返回NaN或引发异常的一般函数,另一个包装一般的函数.功能并识别'错误'的情况.这样,您可以拥有多个版本,每个版本都有不同的"默认"大小写. - 或者如果你正在做很多事情,你甚至可以将"默认"值作为你可以传递的参数.
同样,这个问题没有一个答案:空序列的平均值是未定义的.您希望如何处理它取决于计算结果的用途:只显示或进一步计算?空列表应该是例外,还是应该安静地处理?您是否希望在发生的时间点处理特殊情况,或者您是否要提升/推迟错误处理?
Bat*_*eba 28
在数学上,它是未定义的,因为分母为零.
因为整数除零的行为在C++中是未定义的,所以如果你在整数类型中工作,则抛出异常.
如果您在IEEE754浮点工作,则返回NaN,因为分子也将为零.(如果分子为正,则返回+ Inf,如果分子为负,则返回-Inf).
Yve*_*ust 14
我建议保持与0.0乘0除法相同的行为,无论它是什么.实际上,人们可以采用as-if规则.这样您就可以与其他操作保持一致,而不必自己做出决定.
(您甚至可以通过返回0.0/0来实现它,但编译器可能会以意想不到的方式对其进行优化.)