home *** CD-ROM | disk | FTP | other *** search
- #include "mathl.h"
-
- #define IBMPC 1
- #define DENORMAL 1
-
- #ifdef IBMPC
- #define EXPMSK 0x800f
- #define MEXP 0x7ff
- #define NBITS 64
- #endif
-
- #ifdef MIEEE
- #define EXPMSK 0x800f
- #define MEXP 0x7ff
- #define NBITS 64
- #endif
-
- extern double MAXNUML;
-
-
- long double frexpl( x, pw2 )
- long double x;
- int *pw2;
- {
- union
- {
- long double y;
- unsigned short sh[6];
- } u;
- int i, k;
- short *q;
-
- u.y = x;
-
- #ifdef UNK
- mtherr( "frexp", DOMAIN );
- return(0.0L);
- #endif
-
- /* find the exponent (power of 2) */
- #ifdef IBMPC
- q = (short *)&u.sh[4];
- i = *q & 0x7fff;
- #endif
-
- #ifdef MIEEE
- q = (short *)&u.sh[0];
- i = *q & 0x7fff;
- #endif
-
-
- if( i == 0 )
- {
- if( u.y == 0.0L )
- {
- *pw2 = 0;
- return(0.0L);
- }
- /* Number is denormal or zero */
- #ifdef DENORMAL
- /* Handle denormal number. */
- do
- {
- u.y *= 2.0L;
- i -= 1;
- k = *q & 0x7fff;
- }
- while( (k == 0) && (i > -66) );
- i = i + k;
- #else
- *pw2 = 0;
- return(0.0L);
- #endif /* DENORMAL */
- }
-
- *pw2 = i - 0x3ffe;
- *q = 0x3ffe;
- return( u.y );
- }
-