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.87

    Oder
    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. 😉


  • Mod

    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.


Anmelden zum Antworten