Kenobi van Gin
Brillenschlange
Hello again.
Ich verstehe gerade die (C++-) Welt nicht mehr. Wie bereits in meinem anderen Frage-Thread erwähnt, bastle ich gerade an einer Klasse, die zwischen dezimal, binär und hexadezimal hin- und herkonvertieren kann. Das allermeiste funktioniert tadellos. Nur die Umrechnung von dezimal in hexa bereitet mir gerade Kopfzerbrechen. An und für sich funktioniert auch diese Funktion gut, nur dass ich bei Eingaben ab einer bestimmten Größe immer leicht abweichende (also falsche) Ergebnisse bekomme.
Der relevante Code:
Die Einschübe mit Titel "Debugging" sind, wie unschwer zu erkennen, nur zu Debugging-Zwecken dort. Gebe ich nun zum Beispiel die Zahl 5.000.000 ein, bekomme ich folgende Ausgabe:
Alle paar Durchgänge bekomme ich solche Abweichungen. Entsprechend ist die Gesamtabweichung größer, je höher die umzuwandelnde Zahl. Und ich checke einfach nicht, woran das liegt. Die entsprechende Stelle im Code (Zeilen 76 bis 79) sind doch beide Male exakt identisch Ich habe absolut keine Ahnung, was da passiert. Hat da jemand von euch eine Idee?
Ich verstehe gerade die (C++-) Welt nicht mehr. Wie bereits in meinem anderen Frage-Thread erwähnt, bastle ich gerade an einer Klasse, die zwischen dezimal, binär und hexadezimal hin- und herkonvertieren kann. Das allermeiste funktioniert tadellos. Nur die Umrechnung von dezimal in hexa bereitet mir gerade Kopfzerbrechen. An und für sich funktioniert auch diese Funktion gut, nur dass ich bei Eingaben ab einer bestimmten Größe immer leicht abweichende (also falsche) Ergebnisse bekomme.
Der relevante Code:
[src=cpp]string decToHex(long long lngDecInput)
{
int intMaxPower;
long long lngRemaining = lngDecInput;
stringstream sConv;
string strResult = "";
string strTmp = "";
if (lngDecInput <= 9)
{
sConv << lngDecInput;
sConv >> strResult;
sConv.clear();
return strResult;
}
for (int intPower = 0; ; intPower++)
{
if (pow(15.0, intPower) == lngDecInput)
{
intMaxPower = intPower;
break;
}
if (pow(15.0, intPower) > lngDecInput)
{
intMaxPower = intPower - 1;
break;
}
}
for (int intPower = intMaxPower; intPower >= 0; intPower--)
{
for (int intMultiplier = 15; intMultiplier >= 0; intMultiplier--)
{
if (intMultiplier * pow(15.0, intPower) <= lngRemaining)
{
switch (intMultiplier)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
sConv << intMultiplier;
sConv >> strTmp;
sConv.clear();
break;
case 10:
strTmp = "A";
break;
case 11:
strTmp = "B";
break;
case 12:
strTmp = "C";
break;
case 13:
strTmp = "D";
break;
case 14:
strTmp = "E";
break;
case 15:
strTmp = "F";
break;
}
// ############# DEBUGGING #############
cout << " +++ DEBUGGING +++" << endl <<
" lngRemaining = " << lngRemaining << endl <<
" substracting: " << intMultiplier * pow(15.0, intPower) << endl <<
" supp. NEW lngRemaining: " << lngRemaining - intMultiplier * pow(15.0, intPower) << endl;
lngRemaining = lngRemaining - intMultiplier * pow(15.0, intPower);
// ############# DEBUGGING #############
cout << " NEW lngRemaining = " << lngRemaining << endl;
strResult.append(strTmp);
strTmp = "";
break;
}
}
}
return strResult;
}[/src]
{
int intMaxPower;
long long lngRemaining = lngDecInput;
stringstream sConv;
string strResult = "";
string strTmp = "";
if (lngDecInput <= 9)
{
sConv << lngDecInput;
sConv >> strResult;
sConv.clear();
return strResult;
}
for (int intPower = 0; ; intPower++)
{
if (pow(15.0, intPower) == lngDecInput)
{
intMaxPower = intPower;
break;
}
if (pow(15.0, intPower) > lngDecInput)
{
intMaxPower = intPower - 1;
break;
}
}
for (int intPower = intMaxPower; intPower >= 0; intPower--)
{
for (int intMultiplier = 15; intMultiplier >= 0; intMultiplier--)
{
if (intMultiplier * pow(15.0, intPower) <= lngRemaining)
{
switch (intMultiplier)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
sConv << intMultiplier;
sConv >> strTmp;
sConv.clear();
break;
case 10:
strTmp = "A";
break;
case 11:
strTmp = "B";
break;
case 12:
strTmp = "C";
break;
case 13:
strTmp = "D";
break;
case 14:
strTmp = "E";
break;
case 15:
strTmp = "F";
break;
}
// ############# DEBUGGING #############
cout << " +++ DEBUGGING +++" << endl <<
" lngRemaining = " << lngRemaining << endl <<
" substracting: " << intMultiplier * pow(15.0, intPower) << endl <<
" supp. NEW lngRemaining: " << lngRemaining - intMultiplier * pow(15.0, intPower) << endl;
lngRemaining = lngRemaining - intMultiplier * pow(15.0, intPower);
// ############# DEBUGGING #############
cout << " NEW lngRemaining = " << lngRemaining << endl;
strResult.append(strTmp);
strTmp = "";
break;
}
}
}
return strResult;
}[/src]
Die Einschübe mit Titel "Debugging" sind, wie unschwer zu erkennen, nur zu Debugging-Zwecken dort. Gebe ich nun zum Beispiel die Zahl 5.000.000 ein, bekomme ich folgende Ausgabe:
Alle paar Durchgänge bekomme ich solche Abweichungen. Entsprechend ist die Gesamtabweichung größer, je höher die umzuwandelnde Zahl. Und ich checke einfach nicht, woran das liegt. Die entsprechende Stelle im Code (Zeilen 76 bis 79) sind doch beide Male exakt identisch Ich habe absolut keine Ahnung, was da passiert. Hat da jemand von euch eine Idee?