Maison > développement back-end > C++ > Comment la précision en virgule flottante affecte-t-elle les résultats entiers lors de l'utilisation de la fonction C `pow` ?

Comment la précision en virgule flottante affecte-t-elle les résultats entiers lors de l'utilisation de la fonction C `pow` ?

Susan Sarandon
Libérer: 2024-12-31 19:27:14
original
782 Les gens l'ont consulté

How Does Floating-Point Precision Affect Integer Results When Using the C   `pow` Function?

Précision et troncature à virgule flottante en C

En C , la fonction pow prend deux valeurs à virgule flottante double précision en entrée et renvoie un résultat à virgule flottante double précision. Cependant, lorsqu'il s'agit de valeurs d'exposants élevées, la précision en virgule flottante peut conduire à des résultats inattendus.

Le problème avec pow(10,5)

Considérez ce qui suit code :

const int sections = 10;

for (int t = 0; t < 5; t++) {
  int i = pow(sections, 5 - t - 1);  
  cout << i << endl;
}
Copier après la connexion

Le résultat attendu pour ce code est :

10000
1000
100
10
1
Copier après la connexion

Cependant, lorsque vous exécutez le code, vous risquez de rencontrer un résultat incorrect :

9999
1000
99
10
1
Copier après la connexion

Comprendre le problème

Cet écart est dû aux limitations de précision en virgule flottante. En C , les valeurs à virgule flottante double précision ont un nombre limité de chiffres significatifs (environ 15 à 17 chiffres décimaux). Lorsque pow(10,5) est calculé, le résultat est une grande valeur à virgule flottante (100 000,0). Cependant, lorsque vous attribuez cette valeur à une variable entière (telle que i), la partie fractionnaire est tronquée. Par conséquent, la valeur de i devient 9999 au lieu de 10000.

Éviter les problèmes de précision

Pour éviter de tels problèmes de précision, vous pouvez utiliser directement pow(10.0, 5) dans l'instruction cout, qui est évaluée comme une valeur à virgule flottante double précision et arrondie lorsque imprimé :

for (int t = 0; t < 5; t++) {
  cout << pow(sections, 5-t-1) << endl; 
}
Copier après la connexion

Ce code produira le résultat correct :

10000.000000
1000.000000
100.000000
10.000000
1.000000
Copier après la connexion

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