Microsoft KB Archive/129209

= How To Convert 10-Byte Long Doubles to 8-Byte Doubles =

Article ID: 129209

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 5.0 Standard Edition
 * Microsoft Visual C++ 6.0 Service Pack 5

-



This article was previously published under Q129209



SUMMARY
With the 16-bit Microsoft C/C++ compilers, long doubles are stored as 80- bit (10-byte) data types. Under Windows NT, in order to be compatible with other non-Intel floating point implementations, the 80-bit long double format is aliased to the 64-bit (8-byte) double format.

This means that 32-bit programs may not be able read back data files written by 16-bit programs because the long double formats are incompatible.

On Intel platforms, the only workaround is to let the floating point processor handle the conversion from 80-bit to 64-bit doubles. Afterwards, the data can be stored back into a 64-bit double for use under Win32.

The sample code below illustrates how you could use floating point instructions in inline assembly to convert from a 10-byte double in a data file to an 8-byte double.

Sample Code
/* Compile options needed: none


 * 1) include 

void main(void) {  FILE *inFile; char buffer[10]; long double Newdbl;

inFile = fopen("data","rb"); fread(buffer, 10, 1, inFile);     // reads in 10-byte long double fclose(inFile);

// This moves the contents of the buffer into the floating point // register, which then then takes care of the automatic convertion // back to a 8-byte long double

_asm { fld TBYTE PTR buffer; fstp Newdbl; } }

Additional query words: 8.00 9.00 9.10

Keywords: kbhowto kbcompiler KB129209

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.