Maison > développement back-end > C++ > Pourquoi « 0.3 » devient-il « 0.29999999999999999889 » en C ?

Pourquoi « 0.3 » devient-il « 0.29999999999999999889 » en C ?

Linda Hamilton
Libérer: 2024-11-04 12:03:29
original
445 Les gens l'ont consulté

Why Does `0.3` Become `0.2999999999999999889` in C  ?

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;
Copier après la connexion

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>
Copier après la connexion

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!

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