#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