home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Education
/
collectionofeducationcarat1997.iso
/
SCIENCE
/
DE118I.ZIP
/
ETODEC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-02-28
|
3KB
|
182 lines
#include "ehead.h"
void emovi(), emovo(), ecleaz(), eshdn8(), emdnorm();
void todec();
/*
; convert DEC double precision to e type
; double d;
; short e[NE];
; dectoe( &d, e );
*/
void dectoe( d, e )
unsigned short *d;
unsigned short *e;
{
unsigned short y[NI];
register unsigned short r, *p;
ecleaz(y); /* start with a zero */
p = y; /* point to our number */
r = *d; /* get DEC exponent word */
if( *d & (unsigned int )0x8000 )
*p = 0xffff; /* fill in our sign */
++p; /* bump pointer to our exponent word */
r &= 0x7fff; /* strip the sign bit */
if( r == 0 ) /* answer = 0 if high order DEC word = 0 */
goto done;
r >>= 7; /* shift exponent word down 7 bits */
r += EXONE - 0201; /* subtract DEC exponent offset */
/* add our e type exponent offset */
*p++ = r; /* to form our exponent */
r = *d++; /* now do the high order mantissa */
r &= 0177; /* strip off the DEC exponent and sign bits */
r |= 0200; /* the DEC understood high order mantissa bit */
*p++ = r; /* put result in our high guard word */
*p++ = *d++; /* fill in the rest of our mantissa */
*p++ = *d++;
*p = *d;
eshdn8(y); /* shift our mantissa down 8 bits */
done:
emovo( y, e );
}
/*
; convert e type to DEC double precision
; double d;
; short e[NE];
; etodec( e, &d );
*/
#if 0
static unsigned short decbit[NI] = {0,0,0,0,0,0,0200,0};
void etodec( x, d )
unsigned short *x, *d;
{
unsigned short xi[NI];
register unsigned short r;
int i, j;
emovi( x, xi );
*d = 0;
if( xi[0] != 0 )
*d = 0100000;
r = xi[E];
if( r < (EXONE - 128) )
goto zout;
i = xi[M+4];
if( (i & 0200) != 0 )
{
if( (i & 0377) == 0200 )
{
if( (i & 0400) != 0 )
{
/* check all less significant bits */
for( j=M+5; j<NI; j++ )
{
if( xi[j] != 0 )
goto yesrnd;
}
}
goto nornd;
}
yesrnd:
eaddm( decbit, xi );
r -= enormlz(xi);
}
nornd:
r -= EXONE;
r += 0201;
if( r < 0 )
{
zout:
*d++ = 0;
*d++ = 0;
*d++ = 0;
*d++ = 0;
return;
}
if( r >= 0377 )
{
*d++ = 077777;
*d++ = -1;
*d++ = -1;
*d++ = -1;
return;
}
r &= 0377;
r <<= 7;
eshup8( xi );
xi[M] &= 0177;
r |= xi[M];
*d++ |= r;
*d++ = xi[M+1];
*d++ = xi[M+2];
*d++ = xi[M+3];
}
#else
extern int rndprc;
void etodec( x, d )
unsigned short *x, *d;
{
unsigned short xi[NI];
long exp;
int rndsav;
emovi( x, xi );
exp = (long )xi[E] - (EXONE - 0201); /* adjust exponent for offsets */
/* round off to nearest or even */
rndsav = rndprc;
rndprc = 56;
emdnorm( xi, 0, 0, exp, 64 );
rndprc = rndsav;
todec( xi, d );
}
void todec( x, y )
unsigned short *x, *y;
{
unsigned short i;
unsigned short *p;
p = x;
*y = 0;
if( *p++ )
*y = 0100000;
i = *p++;
if( i == 0 )
{
*y++ = 0;
*y++ = 0;
*y++ = 0;
*y++ = 0;
return;
}
if( i > 0377 )
{
*y++ |= 077777;
*y++ = 0xffff;
*y++ = 0xffff;
*y++ = 0xffff;
return;
}
i &= 0377;
i <<= 7;
eshup8( x );
x[M] &= 0177;
i |= x[M];
*y++ |= i;
*y++ = x[M+1];
*y++ = x[M+2];
*y++ = x[M+3];
}
#endif