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
Susan Sarandonoriginal
2024-12-31 19:27:14830parcourir

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;
}

Le résultat attendu pour ce code est :

10000
1000
100
10
1

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

9999
1000
99
10
1

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; 
}

Ce code produira le résultat correct :

10000.000000
1000.000000
100.000000
10.000000
1.000000

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!

Déclaration:
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