Imprécision à virgule flottante en C
L'arithmétique à virgule flottante en programmation consiste à représenter des nombres réels à l'aide d'un nombre fixe de bits, ce qui entraîne des inexactitudes potentielles . Cet article aborde les problèmes de précision dans les opérations à virgule flottante C, illustrés par le code suivant :
<code class="cpp">double a = 0.3; std::cout.precision(20); std::cout << a << std::endl;
Ce code génère 0,299999999999999999889 au lieu du 0,3 attendu. De plus, si a est ajouté 50 fois à lui-même, le résultat devient 15.000000000000014211 au lieu des 15 attendus.
Explication
Les nombres à virgule flottante ont une précision limitée, déterminée par leur nombre de bits. Les flottants double précision ont 53 bits pour la partie fraction, ce qui donne une précision effective d'environ 15 chiffres décimaux.
Lorsque vous utilisez std::cout.precision(20), vous demandez au flux d'afficher 20 chiffres de précision. Cependant, la valeur sous-jacente de a n’a qu’une précision de 15 chiffres. Les chiffres supplémentaires sont remplis de zéros, entraînant des inexactitudes.
Le deuxième exemple accumule les inexactitudes des ajouts répétés. Étant donné que l'arithmétique à virgule flottante n'est pas associative, des séquences d'additions légèrement différentes peuvent donner des résultats légèrement différents.
Solution
Pour minimiser la perte de précision, ne définissez pas std : cout.precision supérieure à la précision disponible du type numérique. Ceci peut être réalisé en utilisant :
<code class="cpp">std::cout.precision(std::numeric_limits<double>::digits10);</code>
Cela limite la précision à 15 chiffres pour les flotteurs double précision.
Cependant, pour un grand nombre de calculs répétitifs, des erreurs accumulées peuvent encore se produire. Dans de tels cas, des techniques alternatives, telles que l'arithmétique à virgule fixe ou l'utilisation de fractions avec des numérateurs et des dénominateurs entiers, sont recommandées.
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!