Maison > développement back-end > C++ > le corps du texte

Pourquoi mon calcul de probabilité C entraîne-t-il des erreurs en virgule flottante ?

Mary-Kate Olsen
Libérer: 2024-11-09 17:19:02
original
947 Les gens l'ont consulté

Why Does My C   Probability Calculation Incur Floating Point Errors?

Comprendre l'erreur à virgule flottante à travers un exemple simple en C

Dans le domaine de la programmation, les variables à virgule flottante peuvent introduire des erreurs en raison de leur précision finie . Ce phénomène, connu sous le nom d'erreur en virgule flottante, peut survenir lors de l'exécution d'opérations mathématiques impliquant de telles variables.

Considérez l'extrait de code C suivant, qui tente de calculer la probabilité d'exactement deux succès dans une séquence de 10 événements indépendants : où chaque événement a une probabilité 'p' de succès :

double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
Copier après la connexion

Les variables 'pow()' et 'choose()' représentent des mathématiques fonctions.

Maintenant, examinons si ce code est confronté à des erreurs potentielles en virgule flottante. À mesure que la valeur de « k » dans l’équation ci-dessus augmente, l’ampleur des termes « pow(1-p, k) » et « Choose(k, 2) » deviendra très grande. Cela peut conduire à une accumulation d'erreurs en virgule flottante, car ces opérations sont effectuées sur des nombres de plus en plus grands.

Pour visualiser cela, traçons graphiquement l'équation 'f(k)' :

f(k) = pow(1-p, k) * pow(p, k) * choose(k, 2)
Copier après la connexion

où « X » et « Y » sont tous deux en échelle logarithmique.

Pour un ordinateur avec une représentation à virgule flottante 32 bits, nous nous attendrions à 'f(k)' doit être nul pour toutes les valeurs de 'k'. Cependant, en raison des erreurs en virgule flottante, l'erreur augmente considérablement avec des valeurs « k » plus élevées. Cela ressort clairement du graphique ci-dessous :

[Image du graphique XY avec échelle logarithmique]

Dans ce graphique, l'axe X représente « k » et l'axe Y représente le valeur absolue de l'erreur. À mesure que « k » augmente, l'accumulation d'erreurs devient plus prononcée.

Par conséquent, l'extrait de code fourni est effectivement sensible aux erreurs en virgule flottante dues à l'accumulation d'erreurs d'arrondi dans le calcul des probabilités.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal