Les bizarreries de la précision à virgule flottante en C
L'arithmétique à virgule flottante en C présente des comportements qui peuvent être contre-intuitifs. Considérez ce qui suit :
L'expression double a = 0,3 ; attribue une valeur qui représente logiquement 0,3 à la variable a. Cependant, la sortie de std::cout << un &Lt ;&Lt ; std::endl; avec 20 décimales de précision, indique "0,29999999999999999889". Cet écart suggère que le stockage interne du nombre à virgule flottante diffère de sa valeur logique.
De même, dans la boucle où a est ajouté à plusieurs reprises à b, le résultat à la fin de la boucle (50 itérations) est "15,000000000000014211", ce qui est plus élevé qu'il ne devrait l'être. Ce résultat démontre comment les erreurs d'arrondi peuvent s'accumuler au cours de plusieurs opérations.
Pour contourner ces problèmes de précision, il est important d'éviter de définir la précision des valeurs à virgule flottante supérieure à la précision réelle du type de données. Ceci peut être réalisé en utilisant l'approche suivante :
#include
#include
int main() {
double a = 0.3;
std::cout.precision(std::numeric_limits::digits10);
std::cout << a << std::endl;
double b = 0;
for (char i = 1; i <= 50; i++) {
b = b + a;
}
std::cout.precision(std::numeric_limits::digits10);
std::cout << b << std::endl;
}
En définissant la précision sur la précision maximale disponible du type de données double, la sortie représentera avec précision les valeurs stockées. Cependant, si la boucle est exécutée sur un nombre d'itérations beaucoup plus grand (par exemple, 5 000 au lieu de 50), l'erreur accumulée deviendra toujours perceptible en raison des limitations inhérentes à l'arithmétique à virgule flottante.
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!