123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #include <limits.h>
- #include <math.h>
- static const double two54 = 1.80143985094819840000e+16;
- typedef union
- {
- struct {
- #if defined(__BIG_ENDIAN__)
- unsigned long int hi;
- unsigned long int lo;
- #else
- unsigned long int lo;
- unsigned long int hi;
- #endif
- } words;
- double dbl;
- } DblInHex;
- double frexp ( double value, int *eptr )
- {
- DblInHex argument;
- unsigned long int valueHead;
- argument.dbl = value;
- valueHead = argument.words.hi & 0x7fffffffUL;
- *eptr = 0;
- if ( valueHead >= 0x7ff00000 || ( valueHead | argument.words.lo ) == 0 )
- return value;
-
- if ( valueHead < 0x00100000 )
- {
- argument.dbl = two54 * value;
- valueHead = argument.words.hi &0x7fffffff;
- *eptr = -54;
- }
- *eptr += ( valueHead >> 20 ) - 1022;
- argument.words.hi = ( argument.words.hi & 0x800fffff ) | 0x3fe00000;
- return argument.dbl;
- }
|