80Bit IEEE float in 64Bit double in MS VC++ umwandeln
Verwendete man beispielsweise unter Borland Turbo C 3 in DOS einen float
oder double
Wert, so wurde der als IEEE 80Bit float dargestellt, was logisch erscheint, da die FPU der Intel x86 CPU ebenfalls intern mit dieser Au
flösung arbeitet. Ein long double
wird beim gcc C-Compiler ebenfalls in diesr Form repräsentiert. Es ist daher auch üblich, in binären Dateiformaten solche Werte vorzufinden.
Möchte man nun solche Werte im MS VC++ auslesen, steht man vor einem Problem:
Wie der MSDN-Dokumentation zu entnehmen ist, wird dieser Datentyp nicht unterstützt:
In Windows 32-bit programming, the long double data type maps to double. There is, however, assembly language support for computations using the real*10 data type.
Jetzt stellt sich daher die Frage, wie solche Werte ausgelesen und dann auf einen 64Bit breiten double (real*8) konvertiert werden können. Wie ja bereits in der MSDN steht, gibt es auf Assemblerebene Unterstützung für 80Bit breite float
Zahlen.
Es reichen daher auf der x86 CPU 2 kleine FPU-Assemblerkommandos zur Konvertierung. Man kann sich daher folgende kleine Funktion erstellen, welche eine Konvertierung vornimmt:
// float.h required
double _Convert10to8(void *ra)
{
double dbl;
// Floating point register clearen:
_clearfp ();
// 80Bit double lesen und auf 64Bit double schreiben
__asm FLD tbyte ptr [rbuf]
__asm FSTP qword ptr [dbl]
// Bei einem Overflow 0 zurückliefern
if (_statusfp() & _SW_OVERFLOW) return 0;
return dbl;
}