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