Mathematische Ungenauigkeiten
-
Hey, ich habe eine kleine Funktion geschrieben um Hex in Dec umzuwandeln.
void hextodec(){ float result = 0; int tmp = 0; float dec = 0; for(int i = 9; i > 1; i--){ switch((int)chip[i]){ case 48: dec = 0; break; case 49: dec = 1; break; case 50: dec = 2; break; case 51: dec = 3; break; case 52: dec = 4; break; case 53: dec = 5; break; case 54: dec = 6; break; case 55: dec = 7; break; case 56: dec = 8; break; case 57: dec = 9; break; case 65: dec = 10; break; case 66: dec = 11; break; case 67: dec = 12; break; case 68: dec = 13; break; case 69: dec = 14; break; case 70: dec = 15; break; } result = result+dec*pow(16,tmp); tmp++; } Serial.print(" Dec Notation: "); Serial.print(result); }Jedoch bekomme ich ein ungenaues Resultat:
0x001FBB82 = 2079618
Aber ich bekomme:
0x001FBB82 = 2079615.87Oder
0x0098A42C = 10003500
Mein resultat:
0x0098A42C = 10003488.00
-
Warum float und nicht unsigned?
-
volkard schrieb:
Warum float und nicht unsigned?
Wegen pow.
-
Warum was eigenes statt Standardlib ?
std::string strHex = "0x001FBB82"; std::string strDec = std::to_string((long long)std::stoi(strHex,0,16));Tadaa. Viel schöner und kürzer, und fehlerfrei.

-
Warum benutzt du Fließkommazahlen, wenn du mit Ganzzahlen arbeitest?
Außerdem:
-Globale Variablen sind Müll.
-Wenn du die Zeilen 7-22 siehst, kommt dir nicht in den Sinn, dass das auch vielleicht besser ginge?
-Die Aufgabe deiner Funktion ist nicht gut spezifiziert. Warum gibt sie etwas aus? Warum gibt sie nicht stattdessen etwas zurück?
-Eine Hex-Darstellung als Eingabe für die Funktion? Wieso nicht gleich die normalen C++-Eingabefunktionen für Hex-Darstellungen nutzen? Ich hätte eher einen Zahlenwert als Eingabe erwartet (wobei man dann natürlich auch die normalen C++-Ausgabefunktionen benutzen könnte). Reines Lernprojekt? Falls ja, dann ist es um so wichtiger, dass du es auch sauber programmierst.iknowtheanswer schrieb:
volkard schrieb:
Warum float und nicht unsigned?
Wegen pow.
Wenn es doch bloß eine Möglichkeit gäbe, Ganzzahlen zu multiplizieren...

-
Vielleicht gefällt es Dir auch, andersrum zu laufen:
void hextodec(){ unsigned result = 0; unsigned dec; for(int i = 2; i <=9; i++){ if(chip[i]<='9')//edit: >='0' muss nicht gestestet werden, da die eingabezahlen //festes format haben und keine ungültigen eigbane reinkommen dec=chip[i]-'0'; else dec=chip[i]-'A'+10; result = result*16+dec; } Serial.print(" Binary Notation: "); Serial.print(result); }da braucht man kein pow() mehr.