646ad54c24479b9508e86a1d92faebd14a15208a
4 * Constants related to floating point arithmetic.
6 * Also included here are some non-ANSI bits for accessing the floating
9 * NOTE: GCC provides float.h, and it is probably more accurate than this,
10 * but it doesn't include the non-standard stuff for accessing the
11 * fp controller. (TODO: Move those bits elsewhere?) Thus it is
12 * probably not a good idea to use the GCC supplied version instead
15 * This file is part of the Mingw32 package.
18 * Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
20 * THIS SOFTWARE IS NOT COPYRIGHTED
22 * This source code is offered for use in the public domain. You may
23 * use, modify or distribute it freely.
25 * This code is distributed in the hope that it will be useful but
26 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
27 * DISCLAMED. This includes but is not limited to warranties of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
32 * $Date: 1999/04/23 18:43:00 $
45 #define FLT_NORMALIZE 1
48 * The characteristics of float.
51 /* The radix for floating point representation. */
54 /* Decimal digits of precision. */
57 /* Smallest number such that 1+x != 1 */
58 #define FLT_EPSILON 1.19209290e-07F
60 /* The number of base FLT_RADIX digits in the mantissa. */
61 #define FLT_MANT_DIG 24
63 /* The maximum floating point number. */
64 #define FLT_MAX 3.40282347e+38F
66 /* Maximum n such that FLT_RADIX^n - 1 is representable. */
67 #define FLT_MAX_EXP 128
69 /* Maximum n such that 10^n is representable. */
70 #define FLT_MAX_10_EXP 38
72 /* Minimum normalized floating-point number. */
73 #define FLT_MIN 1.17549435e-38F
75 /* Minimum n such that FLT_RADIX^n is a normalized number. */
76 #define FLT_MIN_EXP (-125)
78 /* Minimum n such that 10^n is a normalized number. */
79 #define FLT_MIN_10_EXP (-37)
83 * The characteristics of double.
86 #define DBL_EPSILON 1.1102230246251568e-16
87 #define DBL_MANT_DIG 53
88 #define DBL_MAX 1.7976931348623157e+308
89 #define DBL_MAX_EXP 1024
90 #define DBL_MAX_10_EXP 308
91 #define DBL_MIN 2.2250738585072014e-308
92 #define DBL_MIN_EXP (-1021)
93 #define DBL_MIN_10_EXP (-307)
97 * The characteristics of long double.
98 * NOTE: long double is the same as double.
101 #define LDBL_EPSILON 1.1102230246251568e-16L
102 #define LDBL_MANT_DIG 53
103 #define LDBL_MAX 1.7976931348623157e+308L
104 #define LDBL_MAX_EXP 1024
105 #define LDBL_MAX_10_EXP 308
106 #define LDBL_MIN 2.2250738585072014e-308L
107 #define LDBL_MIN_EXP (-1021)
108 #define LDBL_MIN_10_EXP (-307)
112 * Functions and definitions for controlling the FPU.
114 #ifndef __STRICT_ANSI__
116 /* TODO: These constants are only valid for x86 machines */
118 /* Control word masks for unMask */
119 #define _MCW_EM 0x0008001F /* Error masks */
120 #define _MCW_IC 0x00040000 /* Infinity */
121 #define _MCW_RC 0x00000300 /* Rounding */
122 #define _MCW_PC 0x00030000 /* Precision */
124 /* Control word values for unNew (use with related unMask above) */
125 #define _EM_INVALID 0x00000010
126 #define _EM_DENORMAL 0x00080000
127 #define _EM_ZERODIVIDE 0x00000008
128 #define _EM_OVERFLOW 0x00000004
129 #define _EM_UNDERFLOW 0x00000002
130 #define _EM_INEXACT 0x00000001
131 #define _IC_AFFINE 0x00040000
132 #define _IC_PROJECTIVE 0x00000000
133 #define _RC_CHOP 0x00000300
134 #define _RC_UP 0x00000200
135 #define _RC_DOWN 0x00000100
136 #define _RC_NEAR 0x00000000
137 #define _PC_24 0x00020000
138 #define _PC_53 0x00010000
139 #define _PC_64 0x00000000
142 /* Set the FPU control word as cw = (cw & ~unMask) | (unNew & unMask),
143 * i.e. change the bits in unMask to have the values they have in unNew,
144 * leaving other bits unchanged. */
145 unsigned int _controlfp (unsigned int unNew
, unsigned int unMask
);
146 unsigned int _control87 (unsigned int unNew
, unsigned int unMask
);
149 unsigned int _clearfp (void); /* Clear the FPU status word */
150 unsigned int _statusfp (void); /* Report the FPU status word */
151 #define _clear87 _clearfp
152 #define _status87 _statusfp
154 void _fpreset (void); /* Reset the FPU */
156 /* Global 'variable' for the current floating point error code. */
157 int * __fpecode(void);
158 #define _fpecode (*(__fpecode()))
161 * IEEE recommended functions
164 double _chgsign (double x
);
165 double _copysign (double dTo
, double dFrom
);
166 double _logb (double x
);
167 double _nextafter (double x
, double y
);
168 double _scalb (double x
, long n
);
170 /* Return values for fpclass. */
171 #define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
172 #define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
173 #define _FPCLASS_NINF 0x0004 /* Negative Infinity */
174 #define _FPCLASS_NN 0x0008 /* Negative Normal */
175 #define _FPCLASS_ND 0x0010 /* Negative Denormal */
176 #define _FPCLASS_NZ 0x0020 /* Negative Zero */
177 #define _FPCLASS_PZ 0x0040 /* Positive Zero */
178 #define _FPCLASS_PD 0x0080 /* Positive Denormal */
179 #define _FPCLASS_PN 0x0100 /* Positive Normal */
180 #define _FPCLASS_PINF 0x0200 /* Positive Infinity */
182 int _finite (double x
);
183 int _fpclass (double x
);
184 int _isnan (double x
);
185 int _isinf (double x
); // not exported
187 int _isnanl (long double x
); // not exported
188 int _isinfl (long double x
); // not exported
190 #define isnan(x) _isnan(x)
191 #define isinf(x) _isinf(x)
193 #endif /* Not __STRICT_ANSI__ */
199 #endif /* _FLOAT_H_ */