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 155