0
|
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
|
|
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
|
|
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
|