36 votes

Quelle est la moyenne arithmétique d'une séquence vide?

Disclaimer: Non, je n'ai pas trouvé de réponse évidente, contrairement à ce que j'attendais!

Lorsque vous cherchez des exemples de code wrt. la moyenne arithmétique, la première plusieurs exemples je peux l'activer via Google semblent être défini de telle manière que la séquence vide génère une valeur moyenne de 0.0. (eg. ici et ici ...)

La recherche sur Wikipedia cependant, la moyenne Arithmétique est définie de telle qu'une séquence vide donnerait 0.0 / 0 --

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

- et donc, éventuellement, c'est-NaN dans le cas général.

Donc, si j'écris une fonction qui calcule la moyenne arithmétique d'un ensemble de valeurs à virgule flottante, dois-je, dans le cas général:

  • de retour 0. pour la séquence vide?
  • de retour (Q)NaN pour la séquence vide?
  • "lancer une exception" dans le cas de la séquence vide?

35voto

R.M. Points 1371

Il n'y a pas une réponse évidente , parce que le traitement dépend de la façon dont vous souhaitez informer d'appeler le code de l'erreur. (Ou même si vous voulez interpréter cela comme une "erreur".)

Certaines bibliothèques/programmes n'aime vraiment pas le déclenchement d'exceptions, de sorte que tout faire avec la valeur du signal. Dans ce cas, le retour de NaN (parce que la valeur de l'expression est techniquement pas défini) est un choix raisonnable.

Vous pouvez également retourner NaN si vous voulez "silencieusement" ramener la valeur de l'avant à travers de multiples autres calculs. (S'appuyant sur le comportement que NaN combiné avec tout le reste est "silencieux" NaN.)

Mais notez que si vous retournez NaN pour la moyenne d'une séquence vide, vous imposer le fardeau sur l'appel de code qu'ils ont besoin de vérifier la valeur de retour de la fonction pour vous assurer que ce n'est pas NaN - soit immédiatement après le retour ou plus tard. C'est une exigence qui est facile à manquer, en fonction de combien fastidieuse, vous êtes dans la vérification des valeurs de retour.

De ce fait, d'autres bibliothèques/programmes de prendre le point de vue que les conditions d'erreur doit être "bruyant" - si vous avez passé une séquence vide à une fonction qui est de trouver le moyen de la séquence, puis vous avez de toute évidence de faire quelque chose de totalement faux, et il doit être parfaitement clair pour vous que vous avez foiré.

Bien sûr, si des exceptions peuvent être soulevées, dont ils ont besoin pour traiter, mais vous pouvez le faire à un niveau plus élevé, potentiellement centralisée au point où il fait plus de sens. Selon votre programme, cela peut être plus facile ou plus le long des lignes de votre traitement standard des erreurs régime de vérifier les valeurs de retour.

Autres personnes diront que vos fonctions doivent être robustes à l'erreur. Pour un maximum de robustesse, vous ne devriez pas utiliser NaN ou une exception - vous devez choisir un nombre réel qui "fait sens" comme valeur pour la moyenne d'une liste vide.

La valeur va être très spécifique à votre cas d'utilisation. Par exemple, si votre séquence est une liste des différences ou des erreurs, vous pouvez retourner 0. Si vous êtes à la moyenne des scores aux tests (notées de 0 à 100), vous pouvez retourner 100 pour une liste vide ... ou 0, selon que votre philosophie du "départ" score est. Tout dépend de ce que la valeur de retour va être utilisé pour.

Étant donné que la valeur de cette valeur "neutre" va être très variable basée sur l'utilisation exacte cas, vous pourriez vraiment envie de le mettre en œuvre dans deux fonctions - une fonction qui renvoie NaN ou lève une exception, et une autre qui enveloppe le fonctionnement général et l'reconnaît le "erreur" de cas. De cette façon, vous pouvez avoir plusieurs versions, chacune avec un autre "défaut" de cas. - ou si ce est quelque chose que vous avez à faire beaucoup de vous, vous pourriez même avoir la valeur "par défaut" être un paramètre, vous pouvez passer.

Encore une fois, il n'y a pas une réponse unique à cette question: la moyenne d'une séquence vide est indéfini. La façon dont vous souhaitez gérer ça dépend intimement de ce que le résultat du calcul est utilisé pour: Juste l'affichage, ou autre calcul? Si une liste est vide exceptionnelle, ou doit-elle être gérée tranquillement? Voulez-vous gérer le cas particulier au point dans le temps, il se produit, ou voulez-vous de levage/de reporter l'erreur de manipulation?

28voto

Bathsheba Points 23209

Mathématiquement, il n'est pas défini car le dénominateur est zéro.

Le comportement de la division entière par zéro n'étant pas défini en C ++, émettez une exception si vous travaillez dans des types intégraux.

Si vous travaillez en virgule flottante IEEE754, retournez NaN car le numérateur sera également zéro. (+ Inf serait renvoyé si le numérateur est positif et -Inf si le numérateur est négatif).

14voto

Yves Daoust Points 6396

Je suggère de garder le même comportement que pour une division 0.0 par 0, peu importe ce que c'est . En effet, on peut adopter la règle as-if. De cette façon, vous restez cohérent avec les autres opérations et vous n'avez pas à prendre la décision vous-même.

(Vous pouvez même l'implémenter en tant que tel, en renvoyant 0.0 / 0, mais le compilateur pourrait optimiser cela de manière inattendue.)

2voto

Michel Keijzers Points 4831

J'aime le codage défensif, alors je lève une exception. Vous pouvez en faire une exception spécifique (telle que empty_sequence_exception) ou une division par 0, car le diviseur correspond à la longueur de la séquence, qui est 0.

0.0 est discutable puisqu'il n'y a pas de données (séquence).

-1voto

A Hoffman Points 1

La réponse correcte est que la moyenne arithmétique d'une séquence vide n'a pas de sens, car une séquence vide est essentiellement un ensemble vide. La division de rien n'a pas de sens. Zéro n'est certainement pas une réponse correcte. Supposons qu'une séquence a 3 membres, 1, 0 et -1, ou est une séquence de tous les zéros. La moyenne de ces deux valeurs serait zéro et ne devrait pas être confondue avec une séquence vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X