1*2a6b7db3Sskrll #include <ansidecl.h>
2*2a6b7db3Sskrll 
3*2a6b7db3Sskrll #ifdef __IEEE_BIG_ENDIAN
4*2a6b7db3Sskrll 
5*2a6b7db3Sskrll typedef union
6*2a6b7db3Sskrll {
7*2a6b7db3Sskrll   double value;
8*2a6b7db3Sskrll   struct
9*2a6b7db3Sskrll   {
10*2a6b7db3Sskrll     unsigned int sign : 1;
11*2a6b7db3Sskrll     unsigned int exponent: 11;
12*2a6b7db3Sskrll     unsigned int fraction0:4;
13*2a6b7db3Sskrll     unsigned int fraction1:16;
14*2a6b7db3Sskrll     unsigned int fraction2:16;
15*2a6b7db3Sskrll     unsigned int fraction3:16;
16*2a6b7db3Sskrll 
17*2a6b7db3Sskrll   } number;
18*2a6b7db3Sskrll   struct
19*2a6b7db3Sskrll   {
20*2a6b7db3Sskrll     unsigned int sign : 1;
21*2a6b7db3Sskrll     unsigned int exponent: 11;
22*2a6b7db3Sskrll     unsigned int quiet:1;
23*2a6b7db3Sskrll     unsigned int function0:3;
24*2a6b7db3Sskrll     unsigned int function1:16;
25*2a6b7db3Sskrll     unsigned int function2:16;
26*2a6b7db3Sskrll     unsigned int function3:16;
27*2a6b7db3Sskrll   } nan;
28*2a6b7db3Sskrll   struct
29*2a6b7db3Sskrll   {
30*2a6b7db3Sskrll     unsigned long msw;
31*2a6b7db3Sskrll     unsigned long lsw;
32*2a6b7db3Sskrll   } parts;
33*2a6b7db3Sskrll     long aslong[2];
34*2a6b7db3Sskrll } __ieee_double_shape_type;
35*2a6b7db3Sskrll 
36*2a6b7db3Sskrll #endif
37*2a6b7db3Sskrll 
38*2a6b7db3Sskrll #ifdef __IEEE_LITTLE_ENDIAN
39*2a6b7db3Sskrll 
40*2a6b7db3Sskrll typedef union
41*2a6b7db3Sskrll {
42*2a6b7db3Sskrll   double value;
43*2a6b7db3Sskrll   struct
44*2a6b7db3Sskrll   {
45*2a6b7db3Sskrll #ifdef __SMALL_BITFIELDS
46*2a6b7db3Sskrll     unsigned int fraction3:16;
47*2a6b7db3Sskrll     unsigned int fraction2:16;
48*2a6b7db3Sskrll     unsigned int fraction1:16;
49*2a6b7db3Sskrll     unsigned int fraction0: 4;
50*2a6b7db3Sskrll #else
51*2a6b7db3Sskrll     unsigned int fraction1:32;
52*2a6b7db3Sskrll     unsigned int fraction0:20;
53*2a6b7db3Sskrll #endif
54*2a6b7db3Sskrll     unsigned int exponent :11;
55*2a6b7db3Sskrll     unsigned int sign     : 1;
56*2a6b7db3Sskrll   } number;
57*2a6b7db3Sskrll   struct
58*2a6b7db3Sskrll   {
59*2a6b7db3Sskrll #ifdef __SMALL_BITFIELDS
60*2a6b7db3Sskrll     unsigned int function3:16;
61*2a6b7db3Sskrll     unsigned int function2:16;
62*2a6b7db3Sskrll     unsigned int function1:16;
63*2a6b7db3Sskrll     unsigned int function0:3;
64*2a6b7db3Sskrll #else
65*2a6b7db3Sskrll     unsigned int function1:32;
66*2a6b7db3Sskrll     unsigned int function0:19;
67*2a6b7db3Sskrll #endif
68*2a6b7db3Sskrll     unsigned int quiet:1;
69*2a6b7db3Sskrll     unsigned int exponent: 11;
70*2a6b7db3Sskrll     unsigned int sign : 1;
71*2a6b7db3Sskrll   } nan;
72*2a6b7db3Sskrll   struct
73*2a6b7db3Sskrll   {
74*2a6b7db3Sskrll     unsigned long lsw;
75*2a6b7db3Sskrll     unsigned long msw;
76*2a6b7db3Sskrll   } parts;
77*2a6b7db3Sskrll 
78*2a6b7db3Sskrll   long aslong[2];
79*2a6b7db3Sskrll 
80*2a6b7db3Sskrll } __ieee_double_shape_type;
81*2a6b7db3Sskrll 
82*2a6b7db3Sskrll #endif
83*2a6b7db3Sskrll 
84*2a6b7db3Sskrll #ifdef __IEEE_BIG_ENDIAN
85*2a6b7db3Sskrll typedef union
86*2a6b7db3Sskrll {
87*2a6b7db3Sskrll   float value;
88*2a6b7db3Sskrll   struct
89*2a6b7db3Sskrll   {
90*2a6b7db3Sskrll     unsigned int sign : 1;
91*2a6b7db3Sskrll     unsigned int exponent: 8;
92*2a6b7db3Sskrll     unsigned int fraction0: 7;
93*2a6b7db3Sskrll     unsigned int fraction1: 16;
94*2a6b7db3Sskrll   } number;
95*2a6b7db3Sskrll   struct
96*2a6b7db3Sskrll   {
97*2a6b7db3Sskrll     unsigned int sign:1;
98*2a6b7db3Sskrll     unsigned int exponent:8;
99*2a6b7db3Sskrll     unsigned int quiet:1;
100*2a6b7db3Sskrll     unsigned int function0:6;
101*2a6b7db3Sskrll     unsigned int function1:16;
102*2a6b7db3Sskrll   } nan;
103*2a6b7db3Sskrll   long p1;
104*2a6b7db3Sskrll 
105*2a6b7db3Sskrll } __ieee_float_shape_type;
106*2a6b7db3Sskrll #endif
107*2a6b7db3Sskrll 
108*2a6b7db3Sskrll #ifdef __IEEE_LITTLE_ENDIAN
109*2a6b7db3Sskrll typedef union
110*2a6b7db3Sskrll {
111*2a6b7db3Sskrll   float value;
112*2a6b7db3Sskrll   struct
113*2a6b7db3Sskrll   {
114*2a6b7db3Sskrll     unsigned int fraction0: 7;
115*2a6b7db3Sskrll     unsigned int fraction1: 16;
116*2a6b7db3Sskrll     unsigned int exponent: 8;
117*2a6b7db3Sskrll     unsigned int sign : 1;
118*2a6b7db3Sskrll   } number;
119*2a6b7db3Sskrll   struct
120*2a6b7db3Sskrll   {
121*2a6b7db3Sskrll     unsigned int function1:16;
122*2a6b7db3Sskrll     unsigned int function0:6;
123*2a6b7db3Sskrll     unsigned int quiet:1;
124*2a6b7db3Sskrll     unsigned int exponent:8;
125*2a6b7db3Sskrll     unsigned int sign:1;
126*2a6b7db3Sskrll   } nan;
127*2a6b7db3Sskrll   long p1;
128*2a6b7db3Sskrll 
129*2a6b7db3Sskrll } __ieee_float_shape_type;
130*2a6b7db3Sskrll #endif
131*2a6b7db3Sskrll 
132*2a6b7db3Sskrll #if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN)
133*2a6b7db3Sskrll 
134*2a6b7db3Sskrll double
copysign(double x,double y)135*2a6b7db3Sskrll copysign (double x, double y)
136*2a6b7db3Sskrll {
137*2a6b7db3Sskrll   __ieee_double_shape_type a,b;
138*2a6b7db3Sskrll   b.value = y;
139*2a6b7db3Sskrll   a.value = x;
140*2a6b7db3Sskrll   a.number.sign =b.number.sign;
141*2a6b7db3Sskrll   return a.value;
142*2a6b7db3Sskrll }
143*2a6b7db3Sskrll 
144*2a6b7db3Sskrll #else
145*2a6b7db3Sskrll 
146*2a6b7db3Sskrll double
copysign(double x,double y)147*2a6b7db3Sskrll copysign (double x, double y)
148*2a6b7db3Sskrll {
149*2a6b7db3Sskrll   if ((x < 0 && y > 0) || (x > 0 && y < 0))
150*2a6b7db3Sskrll     return -x;
151*2a6b7db3Sskrll   return x;
152*2a6b7db3Sskrll }
153*2a6b7db3Sskrll 
154*2a6b7db3Sskrll #endif
155