| #include <ansidecl.h> | |
| #ifdef __IEEE_BIG_ENDIAN | |
| typedef union | |
| { | |
| double value; | |
| struct | |
| { | |
| unsigned int sign : 1; | |
| unsigned int exponent: 11; | |
| unsigned int fraction0:4; | |
| unsigned int fraction1:16; | |
| unsigned int fraction2:16; | |
| unsigned int fraction3:16; | |
| } number; | |
| struct | |
| { | |
| unsigned int sign : 1; | |
| unsigned int exponent: 11; | |
| unsigned int quiet:1; | |
| unsigned int function0:3; | |
| unsigned int function1:16; | |
| unsigned int function2:16; | |
| unsigned int function3:16; | |
| } nan; | |
| struct | |
| { | |
| unsigned long msw; | |
| unsigned long lsw; | |
| } parts; | |
| long aslong[2]; | |
| } __ieee_double_shape_type; | |
| #endif | |
| #ifdef __IEEE_LITTLE_ENDIAN | |
| typedef union | |
| { | |
| double value; | |
| struct | |
| { | |
| #ifdef __SMALL_BITFIELDS | |
| unsigned int fraction3:16; | |
| unsigned int fraction2:16; | |
| unsigned int fraction1:16; | |
| unsigned int fraction0: 4; | |
| #else | |
| unsigned int fraction1:32; | |
| unsigned int fraction0:20; | |
| #endif | |
| unsigned int exponent :11; | |
| unsigned int sign : 1; | |
| } number; | |
| struct | |
| { | |
| #ifdef __SMALL_BITFIELDS | |
| unsigned int function3:16; | |
| unsigned int function2:16; | |
| unsigned int function1:16; | |
| unsigned int function0:3; | |
| #else | |
| unsigned int function1:32; | |
| unsigned int function0:19; | |
| #endif | |
| unsigned int quiet:1; | |
| unsigned int exponent: 11; | |
| unsigned int sign : 1; | |
| } nan; | |
| struct | |
| { | |
| unsigned long lsw; | |
| unsigned long msw; | |
| } parts; | |
| long aslong[2]; | |
| } __ieee_double_shape_type; | |
| #endif | |
| #ifdef __IEEE_BIG_ENDIAN | |
| typedef union | |
| { | |
| float value; | |
| struct | |
| { | |
| unsigned int sign : 1; | |
| unsigned int exponent: 8; | |
| unsigned int fraction0: 7; | |
| unsigned int fraction1: 16; | |
| } number; | |
| struct | |
| { | |
| unsigned int sign:1; | |
| unsigned int exponent:8; | |
| unsigned int quiet:1; | |
| unsigned int function0:6; | |
| unsigned int function1:16; | |
| } nan; | |
| long p1; | |
| } __ieee_float_shape_type; | |
| #endif | |
| #ifdef __IEEE_LITTLE_ENDIAN | |
| typedef union | |
| { | |
| float value; | |
| struct | |
| { | |
| unsigned int fraction0: 7; | |
| unsigned int fraction1: 16; | |
| unsigned int exponent: 8; | |
| unsigned int sign : 1; | |
| } number; | |
| struct | |
| { | |
| unsigned int function1:16; | |
| unsigned int function0:6; | |
| unsigned int quiet:1; | |
| unsigned int exponent:8; | |
| unsigned int sign:1; | |
| } nan; | |
| long p1; | |
| } __ieee_float_shape_type; | |
| #endif | |
| #if defined(__IEEE_BIG_ENDIAN) || defined(__IEEE_LITTLE_ENDIAN) | |
| double | |
| copysign (double x, double y) | |
| { | |
| __ieee_double_shape_type a,b; | |
| b.value = y; | |
| a.value = x; | |
| a.number.sign =b.number.sign; | |
| return a.value; | |
| } | |
| #else | |
| double | |
| copysign (double x, double y) | |
| { | |
| if ((x < 0 && y > 0) || (x > 0 && y < 0)) | |
| return -x; | |
| return x; | |
| } | |
| #endif |