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);
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)
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!