00001 #if defined(__ppc__)
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <limits.h>
00024 #include <math.h>
00025
00026 static const double two54 = 1.80143985094819840000e+16;
00027
00028 typedef union
00029 {
00030 struct {
00031 #if defined(__BIG_ENDIAN__)
00032 unsigned long int hi;
00033 unsigned long int lo;
00034 #else
00035 unsigned long int lo;
00036 unsigned long int hi;
00037 #endif
00038 } words;
00039 double dbl;
00040 } DblInHex;
00041
00042 double ldexp ( double value, int exp )
00043 {
00044 if ( exp > SHRT_MAX )
00045 exp = SHRT_MAX;
00046 else if ( exp < -SHRT_MAX )
00047 exp = -SHRT_MAX;
00048 return scalb ( value, exp );
00049 }
00050
00051 double frexp ( double value, int *eptr )
00052 {
00053 DblInHex argument;
00054 unsigned long int valueHead;
00055
00056 argument.dbl = value;
00057 valueHead = argument.words.hi & 0x7fffffffUL;
00058
00059 *eptr = 0;
00060 if ( valueHead >= 0x7ff00000 || ( valueHead | argument.words.lo ) == 0 )
00061 return value;
00062
00063 if ( valueHead < 0x00100000 )
00064 {
00065 argument.dbl = two54 * value;
00066 valueHead = argument.words.hi &0x7fffffff;
00067 *eptr = -54;
00068 }
00069 *eptr += ( valueHead >> 20 ) - 1022;
00070 argument.words.hi = ( argument.words.hi & 0x800fffff ) | 0x3fe00000;
00071 return argument.dbl;
00072 }
00073 #endif