2016-09-28 4 views
1

J'ai écrit ce code et la première fois du résultat de boucle est 99. Pourquoi le résultat 99, quand il devrait être 100?Pourquoi un + = b * pow (10, c-i-1) == 99 C++?

#include <iostream> 
#include<math.h> 
using namespace std; 
int main() 
{ 
    int skt = 0; 
    int sk[3]; 
int nsk = 3; 
sk[0]=1; 
sk[1]=2; 
sk[2]=8; 
for (int i=0; i<nsk; i++) 
{ 
    skt = skt + (sk[i]*pow(10.0,nsk-i-1)); 
    cout <<" "<<skt<<endl; 
} 

} 

le résultat de ce code

99 
    119 
    127 

, mais si je l'utilise cmath bibliothèque, il est bonne réponse

#include <iostream> 
#include<cmath> 
using namespace std; 
int main() 
{ 
    int skt = 0; 
    int sk[3]; 
int nsk = 3; 
sk[0]=1; 
sk[1]=2; 
sk[2]=8; 
for (int i=0; i<nsk; i++) 
{ 
    skt = skt + (sk[i]*pow(10.0,nsk-i-1)); 
    cout <<" "<<skt<<endl; 
} 

} 

le résultat de ce code

100 
    120 
    128 

pourrait Quelqu'un explique-t-il pourquoi?

+1

pow est pour les doubles non entiers. Rappelez-vous la conversion d'un double en entier tronque. – drescherjm

+2

Puisque vous utilisez 'pow' vous devriez lire: http://stackoverflow.com/questions/588004/is-floating-point-math-broken – NathanOliver

+0

Pas sûr à 100% s'il devrait être utilisé comme cible de dupe. – NathanOliver

Répondre

0

de ce lien cplusplus.com

surcharges supplémentaires sont fournies dans cet en-tête (cmath) pour d'autres combinaisons de types arithmétiques (Type1 et Type2): Ces surcharges effectivement jeté ses arguments à doubler avant les calculs, sauf à au moins un des arguments est de type long double (dans ce cas, les deux sont castés en long double à la place).

Je parie que si vous le lancez, il serait correct dans math.h

0

Les versions math.h et cmath de pow sont légèrement différentes. Fondamentalement, il existe plus d'entrées supportées pour la version cmath. Vous pouvez comparer les deux à ces liens.

math.h et cmath

0

Comme les gens ont fait des commentaires, il est probablement lié à la conversion de type variable et des erreurs à virgule flottante. Pow fonctionne sur les doubles, qui peuvent avoir des erreurs en virgule flottante. Les chances sont pow renvoie une valeur comme 99.9999999 qui est ensuite convertie en un nombre entier. Puisque la conversion d'entier tronque au lieu de tours, vous obtenez 99.