¿Cuál es la media aritmética de una secuencia vacía?


Descargo de responsabilidad: ¡No, no encontré ninguna respuesta obvia, contrariamente a lo que esperaba!

Al buscar ejemplos de código wrt. la media aritmética, los primeros ejemplos que puedo encontrar a través de Google parecen estar definidos de tal manera que la secuencia vacía genera un valor medio de 0.0. (eg. aquí y aquí ...)

Mirando Wikipedia sin embargo, la Media aritmética se define de tal manera que una secuencia vacía daría 0.0 / 0 {

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

So así que, posiblemente, eso es NaN en el caso general.

Así que si escribo una función de utilidad que calcula la media aritmética de un conjunto de valores de coma flotante, debería, en el caso general:

  • return 0. for the empty sequence?
  • return (Q)NaN for the empty sequence?
  • "lanzar una excepción" en caso de secuencia vacía?
Author: Community, 2016-09-26

5 answers

No hay una respuesta obvia porque el manejo depende de cómo desea informar al código de llamada del error. (O incluso si desea interpretar esto como un "error".)

A algunas bibliotecas/programas realmente no les gusta levantar excepciones, así que haga todo con valores de señal. En ese caso, devolver NaN (porque el valor de la expresión es técnicamente indefinido) es una opción razonable.

Es posible que también desee devolver NaN si desea" silenciosamente " traer el valor adelante a través de múltiples otros cálculos. (Confiar en el comportamiento que Nan combinó con cualquier otra cosa es "silenciosamente" NaN.)

Pero ten en cuenta que si devuelves NaN para la media de una secuencia vacía, impones la carga de llamar al código que necesitan para comprobar el valor devuelto de la función para asegurarse de que no es NaN, ya sea inmediatamente después de la devolución o más tarde. Este es un requisito que es fácil de pasar por alto, dependiendo de lo fastidioso que sea al verificar la devolución valor.

Debido a esto, otras bibliotecas/programas toman el punto de vista de que las condiciones de error deben ser "ruidosas" - si usted pasó una secuencia vacía a una función que está encontrando la media de la secuencia, entonces usted obviamente ha hecho algo muy mal, y debe ser muy claro para usted que usted ha metido la pata.

Por supuesto, si se pueden plantear excepciones, deben manejarse, pero puede hacerlo a un nivel superior, potencialmente centralizado en el punto donde se hace más sentido. Dependiendo de su programa, esto puede ser más fácil o más a lo largo de las líneas de su esquema de manejo de errores estándar que la doble comprobación de valores de retorno.

Otras personas argumentarían que sus funciones deben ser robustas para el error. Para obtener la máxima robustez, probablemente no debería usar NaN o una excepción: debe elegir un número real que "tenga sentido" como valor para el promedio de una lista vacía.

Qué valor va a ser altamente específico para su caso de uso. Por ejemplo, si su secuencia es una lista de diferencias/errores, es posible que devuelva 0. Si estás promediando las puntuaciones de las pruebas (de 0 a 100), es posible que quieras devolver 100 por una lista vacía ... o 0, dependiendo de cuál sea tu filosofía de la puntuación "inicial". Todo depende de para qué se va a utilizar el valor devuelto.

Dado que el valor de este valor" neutral " va a ser altamente variable basado en el caso de uso exacto, es posible que desee implementarlo en dos funciones - una función general que devuelve NaN o plantea una excepción, y otra que envuelve la función general y reconoce el caso de 'error'. De esta manera puede tener varias versiones, cada una con un caso "predeterminado" diferente. -- o si esto es algo que estás haciendo mucho, incluso podría tener el valor "predeterminado" ser un parámetro que puede pasar.

De nuevo, no hay una sola respuesta a esta pregunta: el promedio de una secuencia vacía es indefinida. Cómo quieres manejarlo depende íntimamente en lo que el resultado del cálculo se está utilizando para: Solo visualización, o cálculo adicional? ¿Una lista vacía debe ser excepcional, o debe ser manejada silenciosamente? ¿Desea manejar el caso especial en el momento en que ocurre, o desea levantar/aplazar el manejo de errores?

 34
Author: R.M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 20:37:39

Matemáticamente, no está definido ya que el denominador es cero.

Debido a que el comportamiento de la división entera por cero es indefinido en C++, lanza una excepción si estás trabajando en tipos integrales.

Si está trabajando en punto flotante IEEE754, entonces devuelva NaN ya que el numerador también será cero. (+Inf sería devuelto si el numerador es positivo, y -Inf si el numerador es negativo).

 28
Author: Bathsheba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 15:41:28

Sugiero mantener el mismo comportamiento que para una división 0.0 por 0, sea lo que sea. De hecho, uno puede adoptar la regla de como si. De esta manera usted permanece coherente con otras operaciones y usted no tiene que tomar la decisión usted mismo.

(Incluso podría implementarlo como tal, devolviendo 0.0/0, pero el compilador podría optimizar esto de maneras inesperadas.)

 14
Author: Yves Daoust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 20:11:47

Me gusta la codificación defensiva, así que lanzaría una excepción. Puede hacer que sea una excepción específica (como empty_sequence_exception) o una división por 0, ya que el divisor es la longitud de la secuencia que es 0.

0.0 es discutible ya que no hay datos (secuencia).

 2
Author: Michel Keijzers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 15:33:48

La respuesta correcta es que la media aritmética de una secuencia vacía no tiene significado, ya que una secuencia vacía es esencialmente un conjunto vacío. La división de la nada no tiene sentido. Cero ciertamente no es una respuesta correcta. Digamos que una secuencia tiene 3 miembros, 1, 0 y -1, o es una secuencia de todos los ceros. La media de ambos sería cero, y no debe confundirse con una secuencia vacía.

 -1
Author: A Hoffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-28 01:27:47