2010-08-18 9 views
0

Je vois que pour le code suivant produit le résultat ci-dessous, une idée sur pourquoi la sortie est comme ça?La fonction pow() de C selon le fichier d'en-tête <math.h> ne fonctionne pas correctement

#include <stdio.h> 
#include <math.h> 

int main() { 
    int i = 0; 
    for(i = 0; i < 10; i++) { 
     printf("%d\t\t\t%d\t\t\t", i, (int)pow(10, i));  
     printf("%f\n", pow(10, i)); 
    } 
    return 0; 
} 

Sorties:

0      1      1.000000 

1      10      10.000000 

2      99      100.000000 

3      1000     1000.000000 

4      9999     10000.000000 

5      100000     100000.000000 

6      1000000     1000000.000000 

7      9999999     10000000.000000 

8      99999999    100000000.000000 

9      999999999    1000000000.000000 
+0

duplication possible de [comportement étrange de la fonction pow] (http://stackoverflow.com/questions/18155883/strange-behaviour-of-the-pow-function) –

Répondre

2

Utilisez la fonction round() avant la coulée à int, sinon les chiffres de suivi seront simplement obtenir tronquée.

+0

Merci pour votre contribution je l'ai juste oublié :) – Sanjay

2

Comme pour chacune des milliards d'autres questions sur SO à faire avec le point flottant :-), la réponse est que tous les nombres ne peuvent pas être représentés exactement.

Et, même si elles peuvent être représentés exacly, vous pouvez obtenir un mauvais résultat de quelque chose comme pow qui peut travailler dans une boucle. En d'autres termes, peu importe la petite erreur sur une opération, si vous le faites beaucoup de fois, l'erreur devient grande.

Essayez d'imprimer le retour de pow(10,4) avec un %.50f ou autre spécificateur à virgule flottante, et je vous garantis que vous verrez quelque chose comme 9999.9999999237623465 au lieu de 10000.

Pour ce que cela vaut, les résultats corrects sont générés sous gcc 3.4.4 sous CygWin, il est donc probable que vous utilisiez une implémentation moins exacte de pow.

+0

Oui, je le comprends, merci – Sanjay