OSDN Git Service

* libmath/stubs.c (hypot, hypotf, hypotl): Don't divide by
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / libmath / mathconf.h
1 /* Configuration data for libmath subpart of libstdc++. */
2
3 /* Copyright (C) 1997-1999, 2000, 2001 Free Software Foundation, Inc.
4
5    This file is part of the GNU ISO C++ Library.  This library is free
6    software; you can redistribute it and/or modify it under the
7    terms of the GNU General Public License as published by the
8    Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License along
17    with this library; see the file COPYING.  If not, write to the Free
18    Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19    USA.
20
21    As a special exception, you may use this file as part of a free software
22    library without restriction.  Specifically, if other files instantiate
23    templates or use macros or inline functions from this file, or you compile
24    this file and link it with other files to produce an executable, this
25    file does not by itself cause the resulting executable to be covered by
26    the GNU General Public License.  This exception does not however
27    invalidate any other reasons why the executable file might be covered by
28    the GNU General Public License.  */
29
30
31 #include <config.h>
32
33 #ifdef HAVE_ENDIAN_H
34 # include <endian.h>
35 #else
36 # ifdef HAVE_MACHINE_ENDIAN_H
37 #  ifdef HAVE_SYS_TYPES_H
38 #   include <sys/types.h>
39 #  endif
40 #  include <machine/endian.h>
41 # else
42 #  ifdef HAVE_SYS_MACHINE_H
43 #   include <sys/machine.h>
44 #  else
45 #   if defined HAVE_SYS_ISA_DEFS_H || defined HAVE_MACHINE_PARAM_H
46 /* This is on Solaris.  */
47 #    ifdef HAVE_SYS_ISA_DEFS_H
48 #     include <sys/isa_defs.h>
49 #    endif
50 #    ifdef HAVE_MACHINE_PARAM_H
51 #     include <machine/param.h>
52 #    endif
53 #    ifdef _LITTLE_ENDIAN
54 #     define LITTLE_ENDIAN 1
55 #    endif
56 #    ifdef _BIG_ENDIAN
57 #     define BIG_ENDIAN 1
58 #    endif
59 #    define BYTE_ORDER 1
60 #   else
61 /* We have to rely on the AC_C_BIGENDIAN test.  */
62 #    ifdef WORDS_BIGENDIAN
63 #     define BIG_ENDIAN 1
64 #    else
65 #     define LITTLE_ENDIAN 1
66 #    endif
67 #    define BYTE_ORDER 1
68 #   endif
69 #  endif
70 # endif
71 #endif
72
73 typedef unsigned int U_int32_t __attribute ((mode (SI)));
74 typedef int Int32_t __attribute ((mode (SI)));
75 typedef unsigned int U_int64_t __attribute ((mode (DI)));
76 typedef int Int64_t __attribute ((mode (DI)));
77
78 #ifdef HAVE_NAN_H
79 # include <nan.h>
80 #endif
81
82 #ifndef NAN
83 # define NAN (nan())
84 double nan (void);
85 #endif
86
87 #ifdef HAVE_IEEEFP_H
88 # include <ieeefp.h>
89 #endif
90
91 #ifdef HAVE_FP_H
92 # include <fp.h>
93 #endif
94
95 #ifdef HAVE_FLOAT_H
96 # include <float.h>
97 #endif
98
99 /* `float' variant of HUGE_VAL.  */
100 #ifndef HUGE_VALF
101 # ifdef HUGE_VALf
102 #  define HUGE_VALF HUGE_VALf
103 # else
104 #  define HUGE_VALF HUGE_VAL
105 # endif
106 #endif
107
108 /* `long double' variant of HUGE_VAL.  */
109 #ifndef HUGE_VALL
110 # ifdef HUGE_VALl
111 #  define HUGE_VALL HUGE_VALl
112 # else
113 #  define HUGE_VALL HUGE_VAL
114 # endif
115 #endif
116
117 /* Make sure that at least HUGE_VAL is defined.  */
118 #ifndef HUGE_VAL
119 # ifdef HUGE
120 #  define HUGE_VAL HUGE
121 # else
122 #  ifdef MAXFLOAT
123 #   define HUGE_VAL MAXFLOAT
124 #  else
125 #   error "We need HUGE_VAL!"
126 #  endif
127 # endif
128 #endif
129
130 #ifndef M_PI
131 # define M_PI 3.14159265358979323846
132 #endif
133
134
135 #ifdef __cplusplus
136 extern "C" {
137 #endif
138
139 /* signbit is a macro in ISO C99.  */
140 #ifndef signbit
141 extern int __signbitf (float);
142 extern int __signbit (double);
143 extern int __signbitl (long double);
144
145 # define signbit(x) \
146      (sizeof (x) == sizeof (float) ?                                          \
147         __signbitf (x)                                                        \
148       : sizeof (x) == sizeof (double) ?                                       \
149         __signbit (x) : __signbitl (x))
150 #endif
151
152 #if BYTE_ORDER == BIG_ENDIAN
153 typedef union
154 {
155   double value;
156   struct
157   {
158     U_int32_t msw;
159     U_int32_t lsw;
160   } parts;
161 } ieee_double_shape_type;
162 #endif
163 #if BYTE_ORDER == LITTLE_ENDIAN
164 typedef union
165 {
166   double value;
167   struct
168   {
169     U_int32_t lsw;
170     U_int32_t msw;
171   } parts;
172 } ieee_double_shape_type;
173 #endif
174 /* Get the more significant 32 bit int from a double.  */
175 #define GET_HIGH_WORD(i,d)                                      \
176 do {                                                            \
177   ieee_double_shape_type gh_u;                                  \
178   gh_u.value = (d);                                             \
179   (i) = gh_u.parts.msw;                                         \
180 } while (0)
181
182
183 typedef union
184 {
185   float value;
186   U_int32_t word;
187 } ieee_float_shape_type;
188 /* Get a 32 bit int from a float.  */
189 #define GET_FLOAT_WORD(i,d)                                     \
190 do {                                                            \
191   ieee_float_shape_type gf_u;                                   \
192   gf_u.value = (d);                                             \
193   (i) = gf_u.word;                                              \
194 } while (0)
195
196
197 #if BYTE_ORDER == BIG_ENDIAN
198 typedef union
199 {
200   long double value;
201   struct
202   {
203     unsigned int sign_exponent:16;
204     unsigned int empty:16;
205     U_int32_t msw;
206     U_int32_t lsw;
207   } parts;
208 } ieee_long_double_shape_type;
209 #endif
210 #if BYTE_ORDER == LITTLE_ENDIAN
211 typedef union
212 {
213   long double value;
214   struct
215   {
216     U_int32_t lsw;
217     U_int32_t msw;
218     unsigned int sign_exponent:16;
219     unsigned int empty:16;
220   } parts;
221 } ieee_long_double_shape_type;
222 #endif
223 /* Get int from the exponent of a long double.  */
224 #define GET_LDOUBLE_EXP(exp,d)                                  \
225 do {                                                            \
226   ieee_long_double_shape_type ge_u;                             \
227   ge_u.value = (d);                                             \
228   (exp) = ge_u.parts.sign_exponent;                             \
229 } while (0)
230
231 #if BYTE_ORDER == BIG_ENDIAN
232 typedef union
233 {
234   long double value;
235   struct
236   {
237     U_int64_t msw;
238     U_int64_t lsw;
239   } parts64;
240   struct
241   {
242     U_int32_t w0, w1, w2, w3;
243   } parts32;
244 } ieee_quad_double_shape_type;
245 #endif
246 #if BYTE_ORDER == LITTLE_ENDIAN
247 typedef union
248 {
249   long double value;
250   struct
251   {
252     U_int64_t lsw;
253     U_int64_t msw;
254   } parts64;
255   struct
256   {
257     U_int32_t w3, w2, w1, w0;
258   } parts32;
259 } ieee_quad_double_shape_type;
260 #endif
261 /* Get most significant 64 bit int from a quad long double.  */
262 #define GET_LDOUBLE_MSW64(msw,d)                                \
263 do {                                                            \
264   ieee_quad_double_shape_type qw_u;                             \
265   qw_u.value = (d);                                             \
266   (msw) = qw_u.parts64.msw;                                     \
267 } while (0)
268
269
270 /* Replacement for non-existing float functions.  */
271 #if !defined(HAVE_FABSF) && !defined(HAVE___BUILTIN_FABSF)
272 # define fabsf(x) fabs (x)
273 #endif
274 #if !defined(HAVE_COSF) && !defined(HAVE___BUILTIN_COSF)
275 # define cosf(x) cos (x)
276 #endif
277 #ifndef HAVE_COSHF
278 # define coshf(x) cosh (x)
279 #endif
280 #ifndef HAVE_EXPF
281 # define expf(x) expf (x)
282 #endif
283 #ifndef HAVE_LOGF
284 # define logf(x) log(x)
285 #endif
286 #ifndef HAVE_LOG10F
287 # define log10f(x) log10 (x)
288 #endif
289 #ifndef HAVE_POWF
290 # define powf(x, y) pow (x, y)
291 #endif
292 #if !defined(HAVE_SINF) && !defined(HAVE___BUILTIN_SINF)
293 # define sinf(x) sin (x)
294 #endif
295 #ifndef HAVE_SINHF
296 # define sinhf(x) sinh (x)
297 #endif
298 #if !defined(HAVE_SQRTF) && !defined(HAVE___BUILTIN_SQRTF)
299 # define sqrtf(x) sqrt (x)
300 #endif
301 #ifndef HAVE_TANF
302 # define tanf(x) tan (x)
303 #endif
304 #ifndef HAVE_TANHF
305 # define tanhf(x) tanh (x)
306 #endif
307 #ifndef HAVE_STRTOF
308 # define strtof(s, e) strtod (s, e)
309 #endif
310
311 #ifdef __cplusplus
312 }
313 #endif
314