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;
}