home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 6.ddi / MWHC.006 / 9 < prev    next >
Encoding:
Text File  |  1992-12-09  |  10.2 KB  |  242 lines

  1. /*
  2.  *   float.h -- ANSI 
  3.  *
  4.  *   Constants that constrain float, double, and long double representation.
  5.  *   NOTE: WEITEK does not support "long doubles". Thus all "long doubles" 
  6.  *   are mapped to "doubles".
  7.  *
  8.  *           Copyright (c) 1990, MetaWare Incorporated
  9.  */
  10.  
  11. #ifndef _FLOAT_H
  12. #define _FLOAT_H
  13.  
  14. #ifdef __CPLUSPLUS__
  15. extern "C" {
  16. #endif
  17.  
  18. #if (_IBM370 || _ENGINE)
  19. /* Characteristics of floating types -- 370 fp format */
  20. /* radix of float exponent representation */
  21. #define FLT_RADIX    16
  22.  
  23. /* float addition rounds (1) or chops (0) */
  24. #define FLT_ROUNDS   0
  25.  
  26. /* number of base-FLT_RADIX mant digits */
  27. #define FLT_MANT_DIG                    6
  28. #define DBL_MANT_DIG                    14
  29. #define LDBL_MANT_DIG                   14
  30.  
  31. /* minimum positive floating-point number x | 1.0 + x != 1.0 */
  32. #define FLT_EPSILON    9.5367431640625e-7
  33. #define DBL_EPSILON     2.22044604925031e-16
  34. #define LDBL_EPSILON    ((long double)2.22044604925031e-16)
  35.  
  36. /* maximum number of decimal digits of floating_point precision  */
  37. #define FLT_DIG                         6
  38. #define DBL_DIG                         15
  39. #define LDBL_DIG                        15
  40.  
  41. /* minimum integer x | FLT_RADIX**x aproximates a normalized number */
  42. #define FLT_MIN_EXP                     -63
  43. #define DBL_MIN_EXP                     -63
  44. #define LDBL_MIN_EXP                    -63
  45.  
  46. /* minimum normalized positive number */
  47. #define FLT_MIN                         5.39760534693403e-79
  48. #define DBL_MIN                         5.39760534693403e-79
  49. #define LDBL_MIN                        ((long double)5.39760534693403e-79)
  50.  
  51. /* minimum integer x | 10**x aproximates a normalized number */
  52. #define FLT_MIN_10_EXP                  -78
  53. #define DBL_MIN_10_EXP                  -78
  54. #define LDBL_MIN_10_EXP                 -78
  55.  
  56. /* maximum integer x | FLT_RADIX**x aproximates a normalized number */
  57. #define FLT_MAX_EXP                     64
  58. #define DBL_MAX_EXP                     64
  59. #define LDBL_MAX_EXP                    64
  60.  
  61. /* maximum representable finite number */
  62. #define FLT_MAX                         7.23700514597312e75
  63. #define DBL_MAX                         7.23700557733226e75
  64. #define LDBL_MAX                        ((long double)7.23700557733226e75)
  65.  
  66. /* maximum integer x | 10**x aproximates a normalized number */
  67. #define FLT_MAX_10_EXP                  75
  68. #define DBL_MAX_10_EXP                  75
  69. #define LDBL_MAX_10_EXP                 75
  70.  
  71. #else   /* IEEE */
  72.  
  73. /* Characteristics of floating types -- ieee format */
  74.  
  75. /* radix of float exponent representation */
  76. #define FLT_RADIX    2
  77. #define DBL_RADIX    2
  78. #define LDBL_RADIX   2
  79.  
  80. /* float addition rounding mode */
  81. /* All IEEE machines that we support ROUNDs. */
  82. #define FLT_ROUNDS   1
  83. #define DBL_ROUNDS   1
  84. #define LDBL_ROUNDS  1
  85.  
  86. #if ((_MC68 || _I386 || _MSDOS || _HOBBIT) && !_WEITEK)
  87. /* Doubles or longdoubles? */
  88. #define _D_or_LD(d,ld) ld       /* Yes, long doubles.   */
  89. #else
  90. #define _D_or_LD(d,ld) d        /* No,  doubles only. */
  91. #endif
  92.  
  93. /* number of base-FLT_RADIX mant digits */
  94. #define FLT_MANT_DIG                    24
  95. #define DBL_MANT_DIG                    53
  96. #define LDBL_MANT_DIG _D_or_LD(DBL_MANT_DIG,64)
  97.  
  98. /* minimum positive floating-point number x | 1.0 + x != 1.0 */
  99. #define FLT_EPSILON                     1.19209290e-07F
  100. #define DBL_EPSILON                     2.2204460492503131e-16
  101. #define LDBL_EPSILON _D_or_LD(2.2204460492503131e-16L,1.084202172485504434e-19L)
  102.  
  103. /* maximum number of decimal digits of floating_point precision  */
  104. #define FLT_DIG                         6
  105. #define DBL_DIG                         15
  106. #define LDBL_DIG _D_or_LD(DBL_DIG,19)
  107.  
  108. /* minimum integer x | FLT_RADIX**x aproximates a normalized number */
  109. #define FLT_MIN_EXP                     -125
  110. #define DBL_MIN_EXP                     -1021
  111. #define LDBL_MIN_EXP _D_or_LD(DBL_MIN_EXP,-16381)
  112.  
  113. /* minimum normalized positive number */
  114. #define FLT_MIN                         1.175494350822287508e-38F
  115. #define DBL_MIN                         2.225073858507201383e-308
  116. #define LDBL_MIN _D_or_LD(2.225073858507201383e-308L,3.3621031431120935064e-4932L)
  117.  
  118. /* minimum integer x | 10**x aproximates a normalized number */
  119. #define FLT_MIN_10_EXP                  -37
  120. #define DBL_MIN_10_EXP                  -307
  121. #define LDBL_MIN_10_EXP _D_or_LD(DBL_MIN_10_EXP,-4932)
  122.  
  123. /* maximum integer x | FLT_RADIX**x aproximates a normalized number */
  124. #define FLT_MAX_EXP                     128
  125. #define DBL_MAX_EXP                     1024
  126. #define LDBL_MAX_EXP _D_or_LD(DBL_MAX_EXP,16384)
  127.  
  128. /* maximum representable finite number */
  129. #define FLT_MAX                         3.402823466385288598e+38F
  130. #define DBL_MAX                         1.797693134862315708e+308
  131. #define LDBL_MAX _D_or_LD(1.797693134862315708e+308L,1.189731495357231765e+4932L)
  132.  
  133. /* maximum integer x | 10**x aproximates a normalized number */
  134. #define FLT_MAX_10_EXP                  38
  135. #define DBL_MAX_10_EXP                  308
  136. #define LDBL_MAX_10_EXP _D_or_LD(DBL_MAX_10_EXP,4932)
  137.  
  138. #endif  /* IEEE */
  139.  
  140. #if _MSDOS
  141. #if __HIGHC__
  142.  
  143. /*  The routines defined in this include file emulate only 80387 MSC
  144.  *  operations.  MSC reflects the same changes and info in emulated math
  145.  *  modes, but the HIGH C math emulation uses higher precision formats
  146.  *  and is not readily modified to meet the requirements of this emulation.
  147.  */
  148.  
  149. /* 80387 Status Word format   */
  150. #define SW_INVALID              0x0001  /*      Invalid operation       */
  151. #define SW_DENORMAL              0x0002  /*     Denormalized operand    */
  152. #define SW_ZERODIVIDE              0x0004  /*   Zero divide             */
  153. #define SW_OVERFLOW              0x0008  /*     Overflow                */
  154. #define SW_UNDERFLOW              0x0010  /*    Underflow                               */
  155. #define SW_INEXACT              0x0020  /*      Precision       (Inexact result)        */
  156. #define SW_STACKFAULT              0x0040  /*   Floating point stack fault   */
  157. #define SW_IR                       0x0080  /*  IR unmasked exception flag   */
  158. #define SW_C0                       0x0100  /*  Condition bit 0         */
  159. #define SW_C1                       0x0200  /*  Condition bit 1         */
  160. #define SW_C2                       0x0400  /*  Condition bit 2         */
  161. #define SW_TOS               0x3800  /* FP stack pointer (3 bits,0-7)*/
  162. #define SW_C3                       0x4000  /*  Condition bit 3         */
  163. #define SW_B                       0x8000  /*   B       unmasked exception flag */
  164.  
  165. #define MCW_EM               0x003f  /* interrupt Exception Masks */
  166. #define     EM_INVALID              0x0001  /*  invalid               */
  167. #define     EM_DENORMAL      0x0002  /* denormal       */
  168. #define     EM_ZERODIVIDE    0x0004  /* zero divide    */
  169. #define     EM_OVERFLOW      0x0008  /* overflow       */
  170. #define     EM_UNDERFLOW     0x0010  /* underflow      */
  171. #define     EM_INEXACT              0x0020  /*  inexact (precision) */
  172. #define     EM_STACKFAULT    0x0040  /* stack fault (always 1) */
  173.  
  174. #define MCW_RC  0x0c00  /* Rounding Control */
  175. #define     RC_CHOP     0x0c00  /*      chop */
  176. #define     RC_UP       0x0800  /*      up */
  177. #define     RC_DOWN     0x0400  /*      down */
  178. #define     RC_NEAR     0x0000  /*      near */
  179.  
  180. #define MCW_PC          0x0300  /*      Precision Control  */
  181. #define     PC_24            0x0000  /* 24 bits */
  182. #define     PC_53            0x0200  /* 53 bits */
  183. #define     PC_64            0x0300  /* 64 bits */
  184.  
  185. #define MCW_IC          0x1000  /* Rounding Control              */
  186. #define IC_AFFINE            0x1000  /* affine, uses + and - infinity   */
  187. #define IC_PROJECTIVE        0x0000  /* 80387 ONLY!! Proective infinity */
  188.  
  189. /******  set up the default condition per MSC                           */
  190. /* This is equivalent to a control word of 0x0372, the initialized      */
  191. /*  setting for the 80387 is 0x037f                                     */
  192. #define CW_DEFAULT (IC_AFFINE|RC_NEAR|PC_64|EM_DENORMAL|EM_UNDERFLOW|EM_INEXACT|EM_STACKFAULT)
  193.  
  194.  
  195. /*  EMULATION WORDS  */
  196. /* user Status Word bit definitions */
  197. #define    ESW_INVALID          0x0001  /*   invalid operation          */
  198. #define    ESW_DENORMAL         0x0002  /*   denormal                   */
  199. #define    ESW_ZERODIVIDE       0x0004  /*   zero divide                */
  200. #define    ESW_OVERFLOW         0x0008  /*   overflow                   */
  201. #define    ESW_UNDERFLOW        0x0010  /*   underflow                  */
  202. #define    ESW_INEXACT          0x0020  /*   inexact (precision)        */
  203.  
  204. /* invalid subconditions (SW_INVALID also set)                          */
  205.  
  206. #define SW_UNEMULATED       0x0040 /* unemulated instruction       */
  207.                                    /*      not used in 1/15/90 version */
  208. #define SW_SQRTNEG          0x0080      /* square       root of a neg   number  */
  209. /* 1/15/90 - TRUTH:MSC5.1-NEGATIVE SQRT results in INEXACT and C2 set   */
  210. /*                      indicating      first arg is    Normal, error return is */
  211. /*                      underflow.                                              */
  212. #define SW_STACKOVERFLOW    0x0200      /* FP stack overflow            */
  213. #define SW_STACKUNDERFLOW   0x0400      /* FP stack underflow           */
  214.  
  215.  
  216. /* STATUS WORD for MSC emulation ****************************************/
  217. extern unsigned short int fp_status;
  218.  
  219. /* prototypes ***********************************************************/
  220. extern unsigned short int _clear87(void);
  221. extern unsigned short int _control87(unsigned short int __cw, unsigned short int __mask);
  222. extern void     _fpreset(void);
  223. extern unsigned short int _status87(void);
  224. extern unsigned short int _stat387(void);
  225.  
  226. /*  required assembler prototypes **************************************/
  227. extern void _fpclear87(void);   /*  clear   the 80387       exception bits */
  228.                                 /* get/set the 80387 status     word            */
  229. extern void _fpgetcw(unsigned short int *__fpcntrl);
  230. extern void _fpsetcw(unsigned short int *__fpcntrl);
  231.  
  232. extern unsigned short int _fpgetsw(void);  /* get the 80387 status word       */
  233. extern void _fpinit(void);                 /* reset     the     80387                    */
  234.  
  235. #endif /*__HIGHC__ */
  236. #endif /*_MSDOS */
  237.  
  238. #ifdef __CPLUSPLUS__
  239. }
  240. #endif
  241. #endif /*_FLOAT_H*/
  242.