home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Source / GNU / libg++ / libiberty / copysign.c < prev    next >
C/C++ Source or Header  |  1993-06-29  |  2KB  |  141 lines

  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.  
  133. double DEFUN(copysign, (x, y), double x AND double y)
  134. {
  135.   __ieee_double_shape_type a,b;
  136.   b.value = y;  
  137.   a.value = x;
  138.   a.number.sign =b.number.sign;
  139.   return a.value;
  140. }
  141.