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!