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