| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 | #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 0static 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];}#elseextern 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
 |