REAL48 Datentyp (REAL48 -> REAL64)



  • Hallo,
    ich muss einen Datantyp umwandeln.
    In ANSI-C gibt es die Datentypen:

    float (4 Byte) = REAL32
    double (8 Byte) = REAL64

    mein Problem ich habe aber binäre Daten in einem REAL48 Datentyp vorleigen. (Dieser Datentyp stammt aus alten Pascalzeiten)

    Ich lade die Daten lade ich momentan aus der Datei mit drei "unsigned short int" Integer:

    typedef unsigned short int real48[3];
    

    Der Aufbau des REAL48 ist wie folgt:

    sign                      fraction                      exponent
         |1|                          39                       |     8    |
         +---------+----------+----------+----------+----------+----------+
         |         |          |          |          |          |          |
         +---------+----------+----------+----------+----------+----------+
          47     40 39      32 31      24 23      16 15       8 7        0
    

    Ich benötige nun eine Funktion die mir meinen REAL48 Datentyp in ein Double umwandelt. Ich habe es leider trotz längerem Versuchen nicht hingebaracht!

    Tausend Dank!





  • Ja, hab ich aber anscheinend bin ich zu doof es in C zu übersetzen!?



  • Kannst du nicht deinen alten Pascalcompiler nochmal herauskramen und eine Übersetzungsfunktion schreiben?

    Bei Gleitkommazahlen kann es zu Problemen kommen, da manche Compiler diese auf dem FPU Stapel übergeben, andere in den eax Register laden und wieder andere auf dem Aurgumentstapel oder sonstwie zurückgeben. Hier wäre vielleicht durchaus ein wenig inline ASM von Nöten.



  • Er hat Daten in einem bestimmten Format in einer Datei und will diese Auslesen. Nichts anders. Wozu bedarf es da Assembler?

    Könnte Helfen:

    struct Real48 {
       int sign : 1;
       int mantissa : 39;
       int exponent : 8;
    };
    


  • Helium schrieb:

    Er hat Daten in einem bestimmten Format in einer Datei und will diese Auslesen. Nichts anders. Wozu bedarf es da Assembler?

    Ich hatte es so verstanden, dass er gegen solchen code linken will. Ich sollte wirklich lesen lernen, kann manchmal hilfreich sein.



  • Ben04 schrieb:

    Helium schrieb:

    Er hat Daten in einem bestimmten Format in einer Datei und will diese Auslesen. Nichts anders. Wozu bedarf es da Assembler?

    Ich hatte es so verstanden, dass er gegen solchen code linken will. Ich sollte wirklich lesen lernen, kann manchmal hilfreich sein.

    Ach so, jetzt hab ich's, sorry 🕶



  • Hallo Leute,

    die einzelenen Bits zu extrahieren habe ich auch schon geschafft. Mein wirkliches Problem ist die Umrechnung (IEEE 754 scheint nicht zu funktionieren). Ich poste deshalb hier mal eine Liste mit Dezamalzahlen und deren Abildung wie ich sie in einem Hex Editor lese:

    -1   = 81 00 00 00 00 80
    1    = 81 00 00 00 00 00
    -2   = 82 00 00 00 00 80
    2    = 82 00 00 00 00 00
    -3   = 82 00 00 00 00 C0
    3    = 82 00 00 00 00 40
    -4   = 83 00 00 00 00 80
    4    = 83 00 00 00 00 00
    5    = 83 00 00 00 00 20
    256  = 89 00 00 00 00 00
    257  = 89 00 00 00 00 80
    1024 = 8B 00 00 00 00 00
    1280 = 8B 00 00 00 00 20
    1281 = 8B 00 00 00 20 20
    

    Ich habe am Bespiel der 1280 mal versucht Exponent, Mantisse und Sign zuzuordnen:

    1280 =
    1000 1011  0000 0000  0000 0000  0000 0000  0010 0000 0010 0000
    ?EEE EEEE  MMMM MMMM  MMMM MMMM  MMMM MMMM  MMMM MMMM SMMM MMMM
    

    Ich hoffe es findet sich ein heller Kopf der sich des Problems annimmt.

    Schönen Gruß, Gerbrunn



  • GErbrunn schrieb:

    1280 = 8B 00 00 00 00 20
    

    Ich habe am Bespiel der 1280 mal versucht Exponent, Mantisse und Sign zuzuordnen:

    1280 =
    1000 1011  0000 0000  0000 0000  0000 0000  0010 0000 0010 0000
    ?EEE EEEE  MMMM MMMM  MMMM MMMM  MMMM MMMM  MMMM MMMM SMMM MMMM
    

    Wie wär's wenn Du erstmal Little-Endian richtig liest? 🙂

    1280 = 20 00 00 00 00 8B
    
    1280 =
    0010 0000  0000 0000  0000 0000  0000 0000  0000 0000  1000 1011
    SMMM MMMM  MMMM MMMM  MMMM MMMM  MMMM MMMM  MMMM MMMM  ?EEE EEEE
    


  • GErbrunn schrieb:

    256  = 89 00 00 00 00 00
    257  = 89 00 00 00 00 80
    

    Äh... sicher?!? 😕

    Im ersten Bit ('00' bzw. '80') wird doch das Vorzeichen kodiert. Das wäre der einzige Fall wo dem nicht so ist... 😕


Anmelden zum Antworten