diff options
Diffstat (limited to 'test/math/etodec.c')
-rw-r--r-- | test/math/etodec.c | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/test/math/etodec.c b/test/math/etodec.c deleted file mode 100644 index 22545d6fb..000000000 --- a/test/math/etodec.c +++ /dev/null @@ -1,181 +0,0 @@ -#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 |