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