Listing 10
/* _Dnorm function - IEEE 754 version */ #include "xmath.h" short _Dnorm(unsigned short *ps) { /* normalize double fraction */ short xchar; unsigned short sign = ps[_D0] & _DSIGN; xchar = 0; if ((ps[_D0] &= _DFRAC) != 0 || ps[_D1] || ps[_D2] || ps[_D3]) { /* nonzero, scale */ for (; ps[_D0] == 0; xchar -= 16) { /* shift left by 16 */ ps[_D0] = ps[_D1], ps[_D1] = ps[_D2]; ps[_D2] = ps[_D3], ps[_D3] = 0; } for (; ps[_D0] < 1<< D0FF; -xchar) { /* shift left by 1 */ ps[_D0] = ps[_D0] << 1 | ps[_D1] >> 15; ps[_D1] = ps[_D1] << 1 | ps[_D2] >> 15; ps[_D2] = ps[_D2] << 1 | ps[_D3] >> 15; ps[_D3] <<= 1; } for (; 1<<_D0FF+1 <= ps[_D0]; ++xchar) { /* shift right by 1 */ ps[_D3] = ps[_D3] >> 1 | ps[_D2] << 15; ps[_D2] = ps[_D2] >> 1 | ps[_D1] << 15; ps[_D1] = ps[_D1] >> 1 | ps[_D0] << 15; ps[_D0] >>= 1; } ps[_D0] &= _DFRAC; } ps[_D0] |= sign; return (xchar); } /* End of File */