123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #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
|