sacar que promedio programa para obtener numeros grupo con calificaciones calcule calcular arreglos alumnos c++ numerical-methods

c++ - que - ¿Cuál es la mejor manera numérica de calcular el promedio?



programa que calcule el promedio de 5 calificaciones en java (5)

Ordena los números en orden ascendente de magnitud. Sumarlos, baja magnitud primero. Divide por el conde.

¿Cuál es la mejor manera de calcular el promedio? Con esta pregunta, quiero saber qué algoritmo para calcular el promedio es el mejor en un sentido numérico. Debe tener los errores de redondeo mínimos, no debe ser sensible a los flujos excesivos o insuficientes, etc.

Gracias.

Información adicional: se prefieren los enfoques incrementales, ya que es posible que la cantidad de valores no se ajuste a la RAM (varios cálculos paralelos en archivos de más de 4 GB).


Puede consultar http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.43.3535 (Nick Higham, "La precisión de la suma del punto flotante", SIAM Journal of Scientific Computation, 1993) .

Si lo recuerdo correctamente, la suma compensada (suma Kahan) es buena si todos los números son positivos, por lo menos tan bueno como ordenarlos y sumarlos en orden ascendente (a menos que haya muchos números). La historia es mucho más complicada si algunos números son positivos y otros son negativos, por lo que obtienes una cancelación. En ese caso, hay un argumento para agregarlos en orden descendente.



Siempre uso el siguiente pseudocódigo:

float mean=0.0; // could use doulbe int n=0; // could use long for each x in data: ++n; mean+=(x-mean)/n;

No tengo pruebas formales de su estabilidad, pero puede ver que no tendremos problemas con el desbordamiento numérico, asumiendo que los valores de los datos se comportan bien. Es referido en El Arte de la Programación de Computadoras de Knuth .


Solo para agregar una posible respuesta para discusión adicional:

Calcula incrementalmente el promedio para cada paso:

AVG_n = AVG_ (n-1) * (n-1) / n + VALUE_n / n

o combinación por pares

AVG_ (n_a + n_b) = (n_a * AVG_a + n_b * AVG_b) / (n_a + n_b)

(Espero que las fórmulas sean lo suficientemente claras)