2016-09-28 5 views
1

Ich schrieb diesen Code und das erste Mal der Schleife Ergebnis ist 99. Warum ist Ergebnis 99, wenn es 100 sein sollte?Warum a + = 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; 
} 

} 

das Ergebnis dieser Code

99 
    119 
    127 

, aber wenn ich Bibliothek cmath verwenden ist es richtige Antwort

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

} 

das Ergebnis dieser Code

100 
    120 
    128 

Could jemand erklären warum?

+1

Pow ist für doubles nicht ganze Zahlen. Erinnern Sie sich an die Konvertierung von einer doppelten in eine ganze Zahl. – drescherjm

+2

Da Sie 'pow' verwenden, sollten Sie lesen: http://stackoverflow.com/questions/588004/is-floating-point-math-broken – NathanOliver

+0

Nicht 100% sicher, ob es als ein Ziel dupieren sollte. – NathanOliver

Antwort

0

von diesem Link cplusplus.com

Zusätzliche Überlastungen in diesem Header (cmath) für andere Kombinationen von arithmetischen Typen (Typ 1 und Typ 2) vorgesehen sind: Diese Überlastungen werfen ihre Argumente wirksam vor den Berechnungen zu verdoppeln, es sei denn, bei mindestens eines der Argumente ist vom Typ long double (in diesem Fall werden beide stattdessen zu long double gecastet).

Ich wette, wenn Sie es werfen würde es

0

Die math.h und cmath Versionen von pow sind etwas anders in math.h korrekt sein. Grundsätzlich gibt es mehr unterstützte Eingaben für die CMath-Version. Sie können die beiden bei diesen Links vergleichen.

math.h und cmath

0

Da die Menschen kommentiert haben, ist es wahrscheinlich zu Variablentyp-Konvertierung und Gleitkomma-Fehler. Pow arbeitet mit Doppelpunkten, die Gleitkommafehler haben können. Die Wahrscheinlichkeit, dass pow einen Wert wie 99.9999999 zurückgibt, wird dann in eine ganze Zahl umgewandelt. Da die Integer-Konvertierung anstelle von Runden abschneidet, erhalten Sie 99.

Verwandte Themen