float nach short klappt nicht?



  • Hallo zusammen,

    ich habe eine float-Variable (Temperatur), die einen Wert mit nur einer Nachkommastelle repräsentiert. Diesen Wert möchte ich gerne in einen short-Typ casten. Damit die Nachkommastelle nicht verloren geht, multipliziere ich ihn vorher mit Faktor 10.

    Also beispielsweise:
    float 25,9 => short 259
    float 383,7 => short 3837
    usw.

    Mein Code sieht wie folgt aus (m_EngTemp[1] repräsentiert die Temperatur):

    float Temp_fl;
        short Temp_16;
    
        Temp_fl = m_EngTemp[1]*10;    // Nachkommastelle "weg"multiplizieren
        Temp_16 = (short)Temp_fl;     // Typumwandlung
    

    Soweit funktioniert auch alles Prima. Aber beim Wert 24,9 geschieht mit einem Mal folgendes:
    http://www.250kb.de/u/090325/j/029d1fe6.jpg

    Was läuft hier verkehrt? Wieso klappt der Typecast denn nicht?

    Grüße
    Steffen



  • float kann den Wert nicht "richtig" darstellen. Du willst vermutlich runden und nicht casten, oder?



  • Nee, nicht runden. Casten ist schon richtig.

    Das eigentliche Ziel ist es, den Wert über die serielle Schnittstelle senden. float ist 4 Byte lang. Die Information lässt sich aber auch locker in 2 Byte packen, was für's Senden (und später auch beim Empfänger) wesentlich vorteilhafter ist. Deshalb möchte ich float in short umwandeln...

    Wieso kann float den Wert nicht richtig darstellen? Mit bspw. 25,3 -> 253 klappt es doch auch. Was muss ich tun, damit ich richtig casten kann?



  • Es klappt nur bei einigen Werten nicht richtig. Google mal nach floating point precision.



  • Ok... Mich irritiert dann allerdings, das die Variable mit 259,000 angezeigt wird, wenn sie in Wirklichkeit 258,99xyz ist. Offensichtlich rundet die Watch-Anzeige dann.

    Ich hab's jetzt wie folgt gemacht:

    float Temp_fl;
        short Temp_16;
    
        Temp_fl = m_EngTemp[1]*10;            // Nachkommastelle "weg"multiplizieren
        Temp_16 = (short)floor(Temp_fl+0.5);  // Typumwandlung
    

    Funktioniert offensichtlich. Spricht etwas dagegen?



  • Beachte, dass Du +0.5 nur machen kannst, wenn Du *positive* Zahlen hast! Bei negativen, muss Du 0.5 abziehen!



  • Bist Du Dir da sicher? Ich habe es gerade mal ausprobiert. Wenn ich bei negativen Zahlen 0,5 subtrahiere, liegt mein Ergebnis zu niedrig (bei 0,5 passt es weiterhin)...



  • Ja, Du verwendest ja floor 😉


Log in to reply