home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Devil's Doorknob BBS Capture (1996-2003)
/
devilsdoorknobbbscapture1996-2003.iso
/
Dloads
/
PROGRAMM
/
SNIP0492.ZIP
/
TP6TOD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-12-23
|
2KB
|
75 lines
/*
** Convert Turbo Pascal 6-byte reals to C double format
** Written by Thad Smith III, Boulder, CO. 12/91
** Tested on TC 2.01, BC++ 2.0/3.0, QC 2.50, Power C 2.0.1, ZTC 3.0
** Contributed to the Public Domain.
*/
#include <math.h>
#include <string.h>
#ifdef TEST
#include <stdio.h>
#endif
/*
** Specify packed structures.
** Note: This may not work on some compilers.
*/
#if __TURBOC__ > 0x0201
#pragma option -a-
#elif defined __ZTC__
#pragma ZTC align 1
#else /* MSC, WATCOM */
#pragma pack(1)
#endif
double tp6_to_double(const unsigned char *tp6)
{
struct {
unsigned char be ; /* biased exponent */
unsigned int v1 ; /* lower 16 bits of mantissa */
unsigned int v2 ; /* next 16 bits of mantissa */
unsigned int v3:7; /* upper 7 bits of mantissa */
unsigned int s :1; /* sign bit */
} real;
memcpy (&real, tp6, 6);
if (real.be == 0)
return 0.0;
return (((((128 +real.v3) * 65536.0) + real.v2) * 65536.0 + real.v1) *
ldexp ((real.s? -1.0: 1.0), real.be - (129+39)));
}
#ifdef TEST
/*
** This test program reads 6-byte values, one per line, in
** 12-digit hexadecimal format from stdin, converts to a double,
** then prints it.
*/
void main(void)
{
unsigned char c[6];
int buf[6];
int i, n;
for (;;)
{
n = scanf (" %2x%2x%2x%2x%2x%2x", &buf[0], &buf[1], &buf[2],
&buf[3], &buf[4], &buf[5]);
if (n <= 0)
break;
for (i=0; i < 6; i++)
{
c [i] = buf[i];
printf ("%2.2x", buf[i]);
}
printf (" = %lg\n", tp6_to_double (c));
}
return 0;
}
#endif