[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 10 bytes real



"Karl Schultz" <kschultz@researchsystems.com> wrote:
<...>
> Also, the 80x87 math processors on wintel machines are 80-bit anyway
> and I think that there are instructions that would load 80-bit floats
> into the floating point regs.  After you've done that, you can read
> them back out as a double.  I don't know if there is any C compiler
> support.
<...>

Apparently the MS visual C compiler knows about "long doubles" - 80-bit
IEEE floating point numbers.
*Provided* that your 10-byte numbers are indeed IEEE FP format, you
should be able to use the following routine (compiled etc) to do the
conversion.   On the input side I gues you'd just use a BYTARR or
something, stuffed with the inscrutable 10-byte reals, and for the
output you'd present a DOUBLE array of the right size - hopefully it
will get filled with something useful :-)
I haven't tested the routine below.   (In fact I've never used a "long
double" before.)   But give it a try.
If you don't have a MS visual C compiler, let me know and I will
compile the routine for you.

Cheers
Peter Mason


/*
	10-byte to 8-byte IEEE floating-point converter (untested).
	Peter Mason, CSIRO DEM, October 2000
*/
#define STRICT
#define VC_EXTRALEAN
#include <windows.h>

/***********************************************************************
******/
BOOL WINAPI DllMain(HINSTANCE hinst, unsigned long reason, void *resvd)
{
	hinst=hinst;  reason=reason;  resvd=resvd;
	return 1;
}
/*********************************************************************/
/*
  This is it.
  The call is:
   status=call_external('[pathfconv.dll','idlfp10to8',in10,out8,n)
  . in10[n] is an array of 10-byte IEEE floating-point numbers;
  . out8[n] is an array that will be filled with the conversions;
  . n is the number of numbers (in all its splendour?)
*/
int WINAPI idlfp10to8(int ac, int *a[])
{
	register long double	*in10;
	register double		*out8;
	register int		n;
	if(ac!=3) return 1;	//incorrect number of arguments
	in10 = (long double *)a[0];
	out8 = (double *)a[1];
	n = *a[2];
	for( ; n; --n, ++in10, ++out8) *out8 = (double)(*in10);
	return 0;
}
/*********************************************************************/


Sent via Deja.com http://www.deja.com/
Before you buy.