Der Martin: Typumwandlung 2 x 16 Bit Word zu 1 x 32 Bit Fließkomma

Beitrag lesen

Hallo Sven,

Ich würde es nicht als Hacker-Trick bezeichnen, sondern eher als die natürliche Methode, wenn man einen Speicher- oder Registerinhalt einfach als etwas anderes interpretiert, als es ursprünglich gemeint war.
Funktioniert aber nur, wenn man hardwarenah programmieren kann. Mit Javascript kann man das nicht, weil es keinen direkten Speicherzugriff gibt.

ja, genau.

Man muss sich eine Funktion schreiben, die die Umrechnung von Integer in IEEE-Float manuell vornimmt. Und das dürfte etwas komplizierter werden.
Ja, zumal man auf diese Weise nur "korrekte" Werte gemäß IEEE 754 hinbekommt. Erhält man vom Remote-System aber fehlerhafte oder denormalisierte Werte, kann man sie nicht exakt rekonstruieren, man erhielte bestenfalls die gleichwertige normalisierte Darstellung oder NaN. Die Sonderfälle +INF und -INF kann man dagegen gezielt "herstellen", indem man einfach die entsprechenden Konstanten des Number-Objekts liest.
Ähm, hä? Der Hardware-Trick ist, 32 Bits als Integer in den Speicher zu schieben und als Float wieder zu lesen - ohne sie zu verändern.

Aber dass der in Javascript nicht zur Verfügung steht, hatten wir ja schon festgestellt. Eine Umwandlung kann also nur so erfolgen, dass man die einzelnen Bits der Integer-Quelle maskiert, bewertet und daraus "von Hand" den Fließkommawert interpretiert.

Wie IEEE Floating Point aufgebaut ist, dürfte ja allgemein bekannt sein. Der folgende Ansatz, der aus einem 32bit-Integer den entsprechenden 32bit-Float berechnet, könnte ein Start sein. Sonderfälle des Float-Formats wie -0 oder denormalisierte Darstellung berücksichtigt er allerdings nicht, das Ergebnis ist grundsätzlich normalisiert und 0 hat ein positives Vorzeichen.

function dword2float(dw)  
 { var s =  dw & 0x80000000;                 // sign: 0=positive  
   var e = (dw & 0x7F800000) >> 23;          // exponent  
   var m = (dw & 0x007FFFFF | 0x00800000);   // mantissa  
   var f;                                    // float result  
  
   if (e==0x00)                              // special: zero  
    { return (0.0);                          // deliberately ignore denormalized numbers  
    }  
  
   if (e==0xFF)                              // special: ±INF or NaN  
    { if (m)                                 // is mantissa non-zero? indicates NaN  
         return (Number.NaN);  
      else                                   // otherwise it's ±INF  
         return (s ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY);  
    }  
  
   e -= 127;                                 // adjust exponent from offset binary to 2's complement  
   f = m * pow(2,e-23);                      // compute absolute value of number  
   return (s ? -f : +f);                     // and return positive or negative depending on sign  
 }

Wenn die SPS-Hardware fehlerhafte Floats rüberschiebt, hat man ein Problem.

Das ist genau, was ich im vorigen Posting gesagt habe.

Ciao,
 Martin

--
Der Stress von heute ist die gute alte Zeit von morgen.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(