simple sacar resueltos promedio para mediana hallar ejemplos datos cómo como aritmética aritmetica agrupados c++ math floating-point nan

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



media aritmetica simple (5)

La respuesta correcta es que la media aritmética de una secuencia vacía no tiene ningún 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 debería confundirse con una secuencia vacía.

Descargo de responsabilidad: No, no encontré ninguna respuesta obvia, al contrario de lo que esperaba.

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

Sin embargo, al mirar Wikipedia, la media aritmética se define de tal manera que una secuencia vacía arrojaría 0.0 / 0 -

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

- entonces, posiblemente, eso es NaN en el caso general.

Entonces, 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:

  • devuelve 0. para la secuencia vacía?
  • devuelve (Q)NaN para la secuencia vacía?
  • "lanzar una excepción" en caso de secuencia vacía?

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

Como el comportamiento de la división de enteros por cero no está definido en C ++, ejecute una excepción si trabaja en tipos integrales.

Si estás trabajando en el punto flotante IEEE754, entonces devuelve NaN ya que el numerador también será cero. (+ Inf se devolverá si el numerador es positivo, y -Inf si el numerador es negativo).


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).


Sugiero mantener el mismo comportamiento que para una división de 0.0 por 0, sea ​​lo que sea . De hecho, uno puede adoptar la regla de si ... De esta forma, permanecerá coherente con otras operaciones y no tendrá 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).


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

A algunas bibliotecas / programas realmente no les gusta generar excepciones, por lo tanto, 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 elección razonable.

Es posible que también desee devolver NaN si desea "silenciosamente" adelantar el valor a través de varios otros cálculos. (Depender del comportamiento que NaN combinó con cualquier otra cosa es "silenciosamente" NaN).

Pero tenga en cuenta que si devuelve NaN para la media de una secuencia vacía, usted impone la carga al código de llamada que necesitan para verificar el valor de retorno de la función para asegurarse de que no sea NaN, ya sea inmediatamente después de la devolución o más adelante. . Este es un requisito que es fácil pasar por alto, dependiendo de cuán exigente sea al verificar los valores devueltos.

Debido a esto, otras bibliotecas / programas toman el punto de vista de que las condiciones de error deben ser "ruidosas": si pasó una secuencia vacía a una función que está buscando la media de la secuencia, entonces obviamente ha hecho algo muy incorrecto, y debería que te aclaren que has cometido un error.

Por supuesto, si se pueden plantear excepciones, se deben gestionar, pero puede hacerlo a un nivel superior, potencialmente centralizado en el punto en que tenga más sentido. Dependiendo de su programa, esto puede ser más fácil o más en la línea de su esquema estándar de manejo de errores que la verificación doble de los valores de retorno.

Otras personas argumentarían que sus funciones deberían ser robustas al error. Para obtener la máxima robustez, probablemente no deba 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, puede devolver 0. Si está promediando puntajes de prueba (puntuado 0-100), es posible que desee devolver 100 para una lista vacía ... o 0, dependiendo de cuál sea su filosofía del puntaje "inicial". Todo depende de para qué se va a usar el valor de retorno.

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

Nuevamente, no hay una sola respuesta a esta pregunta: el promedio de una secuencia vacía no está definido. La forma en que desea manejarlo depende íntimamente de para qué se utiliza el resultado del cálculo: ¿solo muestra o realiza más cálculos? ¿Debería una lista vacía ser excepcional, o debería manejarse silenciosamente? ¿Desea manejar el caso especial en el momento en que ocurre, o desea alzar / diferir el manejo del error?