2015-12-08 1 views
2

confiait la tâche de calculer la moyenne arithmétique des n IEEE 754 à double précision flottant points numéros x , x , ..., xn-1 , est-il plus précis pour faireLors du calcul des moyennes arithmétiques, quelle est la méthode de sommation la plus précise?

(ksum ixi)/n

(à savoir la première fait un Kahan-somme de tous les xi, puis en divisant par n) ou

ksum i (xi/n)

(c.-à-d. diviser en premier le xi par n et ensuite Kahan-sommation)? Mes propres tests (avec des nombres aléatoires uniformément distribués dans [0, 1) et des nombres distribués normaux sur toute la plage de nombres à virgule flottante centrée sur 0 avec σ = 1) ont été non concluants, montrant que les deux sont très précis, mais mon choix de données de test aurait pu être particulièrement pauvre. Somme d'abord, puis diviser.

+1

Je soupçonne que le choix dépendra de ce que vous savez de vos données, c'est-à-direla gamme probable des valeurs et la valeur typique de «n». Pour les grandes valeurs 'n' et les grandes valeurs' x', vous pouvez rencontrer des problèmes de débordement avec la première méthode. Inversement, pour de petites valeurs de 'x' et des' n' suffisamment grands, vous pouvez obtenir des dénormals avec la seconde méthode. –

+0

@PaulR En supposant que les deux cas ne se produisent pas, quel serait le choix le plus précis? – fuz

+1

Mon instinct est le premier, car il y a moins d'opérations totales impliquées, mais je n'ai aucune preuve à l'appui. –

Répondre

7

Si vous divisez d'abord puis somme dans le cas général, vous introduisez une erreur d'arrondi proportionnelle au plus grand summand de magnitude, qui bat le plus souvent le point de sommation de Kahan (en cas d'annulation catastrophique, ce que vous protégez, votre le résultat est l'erreur d'arrondi de la division).

La sommation d'abord présente un risque plus important de débordement excessif; pour gérer que correctement, vous devez redimensionner par une puissance exacte de deux que nécessaire pour éviter le débordement. Cependant, c'est assez rare, et jamais quelque chose dont vous avez besoin de vous inquiéter avec des données bien dimensionnées. Pour donner un exemple concret: considérez la moyenne des valeurs 4503599627370496, -4503599627370498 et 2 en double précision. Même en utilisant une sommation naïve, vous obtenez le résultat exact (0) si vous additionnez puis divisez. Si vous divisez et somme, la sommation est exacte (par le lemme de Sterbenz) et pourtant l'erreur est encore grande; le résultat calculé est -0.08333333333333337 (cela vient seulement de l'erreur d'arrondi dans 4503599627370496/3; -4503599627370498/3 est exact).