std_cmath.h revision 161653
1// -*- C++ -*- C forwarding header.
2
3// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
4// Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// You should have received a copy of the GNU General Public License along
18// with this library; see the file COPYING.  If not, write to the Free
19// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20// USA.
21
22// As a special exception, you may use this file as part of a free software
23// library without restriction.  Specifically, if other files instantiate
24// templates or use macros or inline functions from this file, or you compile
25// this file and link it with other files to produce an executable, this
26// file does not by itself cause the resulting executable to be covered by
27// the GNU General Public License.  This exception does not however
28// invalidate any other reasons why the executable file might be covered by
29// the GNU General Public License.
30
31//
32// ISO C++ 14882: 26.5  C library
33//
34
35/** @file cmath
36 *  This is a Standard C++ Library file.  You should @c #include this file
37 *  in your programs, rather than any of the "*.h" implementation files.
38 *
39 *  This is the C++ version of the Standard C Library header @c math.h,
40 *  and its contents are (mostly) the same as that header, but are all
41 *  contained in the namespace @c std.
42 */
43
44#ifndef _GLIBCXX_CMATH
45#define _GLIBCXX_CMATH 1
46
47#pragma GCC system_header
48
49#include <bits/c++config.h>
50#include <bits/cpp_type_traits.h>
51
52#include <math.h>
53
54// Get rid of those macros defined in <math.h> in lieu of real functions.
55#undef abs
56#undef div
57#undef acos
58#undef asin
59#undef atan
60#undef atan2
61#undef ceil
62#undef cos
63#undef cosh
64#undef exp
65#undef fabs
66#undef floor
67#undef fmod
68#undef frexp
69#undef ldexp
70#undef log
71#undef log10
72#undef modf
73#undef pow
74#undef sin
75#undef sinh
76#undef sqrt
77#undef tan
78#undef tanh
79
80
81namespace std
82{
83  // Forward declaration of a helper function.  This really should be
84  // an `exported' forward declaration.
85  template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);
86
87  inline double
88  abs(double __x)
89  { return __builtin_fabs(__x); }
90
91  inline float
92  abs(float __x)
93  { return __builtin_fabsf(__x); }
94
95  inline long double
96  abs(long double __x)
97  { return __builtin_fabsl(__x); }
98
99  using ::acos;
100
101  inline float
102  acos(float __x)
103  { return __builtin_acosf(__x); }
104
105  inline long double
106  acos(long double __x)
107  { return __builtin_acosl(__x); }
108
109  template<typename _Tp>
110    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
111    acos(_Tp __x)
112    {
113      return __builtin_acos(__x);
114    }
115
116  using ::asin;
117
118  inline float
119  asin(float __x)
120  { return __builtin_asinf(__x); }
121
122  inline long double
123  asin(long double __x)
124  { return __builtin_asinl(__x); }
125
126  template<typename _Tp>
127    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
128    asin(_Tp __x)
129    { return __builtin_asin(__x); }
130
131  using ::atan;
132
133  inline float
134  atan(float __x)
135  { return __builtin_atanf(__x); }
136
137  inline long double
138  atan(long double __x)
139  { return __builtin_atanl(__x); }
140
141  template<typename _Tp>
142    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
143    atan(_Tp __x)
144    { return __builtin_atan(__x); }
145
146  using ::atan2;
147
148  inline float
149  atan2(float __y, float __x)
150  { return __builtin_atan2f(__y, __x); }
151
152  inline long double
153  atan2(long double __y, long double __x)
154  { return __builtin_atan2l(__y, __x); }
155
156  template<typename _Tp, typename _Up>
157    inline typename __enable_if<double, __is_integer<_Tp>::_M_type
158                                        && __is_integer<_Up>::_M_type>::_M_type
159    atan2(_Tp __y, _Up __x)
160    { return __builtin_atan2(__y, __x); }
161
162  using ::ceil;
163
164  inline float
165  ceil(float __x)
166  { return __builtin_ceilf(__x); }
167
168  inline long double
169  ceil(long double __x)
170  { return __builtin_ceill(__x); }
171
172  template<typename _Tp>
173    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
174    ceil(_Tp __x)
175    { return __builtin_ceil(__x); }
176
177  using ::cos;
178
179  inline float
180  cos(float __x)
181  { return __builtin_cosf(__x); }
182
183  inline long double
184  cos(long double __x)
185  { return __builtin_cosl(__x); }
186
187  template<typename _Tp>
188    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
189    cos(_Tp __x)
190    { return __builtin_cos(__x); }
191
192  using ::cosh;
193
194  inline float
195  cosh(float __x)
196  { return __builtin_coshf(__x); }
197
198  inline long double
199  cosh(long double __x)
200  { return __builtin_coshl(__x); }
201
202  template<typename _Tp>
203    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
204    cosh(_Tp __x)
205    { return __builtin_cosh(__x); }
206
207  using ::exp;
208
209  inline float
210  exp(float __x)
211  { return __builtin_expf(__x); }
212
213  inline long double
214  exp(long double __x)
215  { return __builtin_expl(__x); }
216
217  template<typename _Tp>
218    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
219    exp(_Tp __x)
220    { return __builtin_exp(__x); }
221
222  using ::fabs;
223
224  inline float
225  fabs(float __x)
226  { return __builtin_fabsf(__x); }
227
228  inline long double
229  fabs(long double __x)
230  { return __builtin_fabsl(__x); }
231
232  template<typename _Tp>
233    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
234    fabs(_Tp __x)
235    { return __builtin_fabs(__x); }
236
237  using ::floor;
238
239  inline float
240  floor(float __x)
241  { return __builtin_floorf(__x); }
242
243  inline long double
244  floor(long double __x)
245  { return __builtin_floorl(__x); }
246
247  template<typename _Tp>
248    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
249    floor(_Tp __x)
250    { return __builtin_floor(__x); }
251
252  using ::fmod;
253
254  inline float
255  fmod(float __x, float __y)
256  { return __builtin_fmodf(__x, __y); }
257
258  inline long double
259  fmod(long double __x, long double __y)
260  { return __builtin_fmodl(__x, __y); }
261
262  using ::frexp;
263
264  inline float
265  frexp(float __x, int* __exp)
266  { return __builtin_frexpf(__x, __exp); }
267
268  inline long double
269  frexp(long double __x, int* __exp)
270  { return __builtin_frexpl(__x, __exp); }
271
272  template<typename _Tp>
273    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
274    frexp(_Tp __x, int* __exp)
275    { return __builtin_frexp(__x, __exp); }
276
277  using ::ldexp;
278
279  inline float
280  ldexp(float __x, int __exp)
281  { return __builtin_ldexpf(__x, __exp); }
282
283  inline long double
284  ldexp(long double __x, int __exp)
285  { return __builtin_ldexpl(__x, __exp); }
286
287  template<typename _Tp>
288  inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
289  ldexp(_Tp __x, int __exp)
290  { return __builtin_ldexp(__x, __exp); }
291
292  using ::log;
293
294  inline float
295  log(float __x)
296  { return __builtin_logf(__x); }
297
298  inline long double
299  log(long double __x)
300  { return __builtin_logl(__x); }
301
302  template<typename _Tp>
303    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
304    log(_Tp __x)
305    { return __builtin_log(__x); }
306
307  using ::log10;
308
309  inline float
310  log10(float __x)
311  { return __builtin_log10f(__x); }
312
313  inline long double
314  log10(long double __x)
315  { return __builtin_log10l(__x); }
316
317  template<typename _Tp>
318    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
319    log10(_Tp __x)
320    { return __builtin_log10(__x); }
321
322  using ::modf;
323
324  inline float
325  modf(float __x, float* __iptr)
326  { return __builtin_modff(__x, __iptr); }
327
328  inline long double
329  modf(long double __x, long double* __iptr)
330  { return __builtin_modfl(__x, __iptr); }
331
332  template<typename _Tp>
333    inline _Tp
334    __pow_helper(_Tp __x, int __n)
335    {
336      return __n < 0
337        ? _Tp(1)/__cmath_power(__x, -__n)
338        : __cmath_power(__x, __n);
339    }
340
341  using ::pow;
342
343  inline float
344  pow(float __x, float __y)
345  { return __builtin_powf(__x, __y); }
346
347  inline long double
348  pow(long double __x, long double __y)
349  { return __builtin_powl(__x, __y); }
350
351  inline double
352  pow(double __x, int __i)
353  { return __pow_helper(__x, __i); }
354
355  inline float
356  pow(float __x, int __n)
357  { return __pow_helper(__x, __n); }
358
359  inline long double
360  pow(long double __x, int __n)
361  { return __pow_helper(__x, __n); }
362
363  using ::sin;
364
365  inline float
366  sin(float __x)
367  { return __builtin_sinf(__x); }
368
369  inline long double
370  sin(long double __x)
371  { return __builtin_sinl(__x); }
372
373  template<typename _Tp>
374    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
375    sin(_Tp __x)
376    { return __builtin_sin(__x); }
377
378  using ::sinh;
379
380  inline float
381  sinh(float __x)
382  { return __builtin_sinhf(__x); }
383
384  inline long double
385  sinh(long double __x)
386  { return __builtin_sinhl(__x); }
387
388  template<typename _Tp>
389    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
390    sinh(_Tp __x)
391    { return __builtin_sinh(__x); }
392
393  using ::sqrt;
394
395  inline float
396  sqrt(float __x)
397  { return __builtin_sqrtf(__x); }
398
399  inline long double
400  sqrt(long double __x)
401  { return __builtin_sqrtl(__x); }
402
403  template<typename _Tp>
404    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
405    sqrt(_Tp __x)
406    { return __builtin_sqrt(__x); }
407
408  using ::tan;
409
410  inline float
411  tan(float __x)
412  { return __builtin_tanf(__x); }
413
414  inline long double
415  tan(long double __x)
416  { return __builtin_tanl(__x); }
417
418  template<typename _Tp>
419    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
420    tan(_Tp __x)
421    { return __builtin_tan(__x); }
422
423  using ::tanh;
424
425  inline float
426  tanh(float __x)
427  { return __builtin_tanhf(__x); }
428
429  inline long double
430  tanh(long double __x)
431  { return __builtin_tanhl(__x); }
432
433  template<typename _Tp>
434    inline typename __enable_if<double, __is_integer<_Tp>::_M_type>::_M_type
435    tanh(_Tp __x)
436    { return __builtin_tanh(__x); }
437}
438
439#if _GLIBCXX_USE_C99_MATH
440#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
441// These are possible macros imported from C99-land. For strict
442// conformance, remove possible C99-injected names from the global
443// namespace, and sequester them in the __gnu_cxx extension namespace.
444namespace __gnu_cxx
445{
446  template<typename _Tp>
447    inline int
448    __capture_fpclassify(_Tp __f) { return fpclassify(__f); }
449
450  template<typename _Tp>
451    inline int
452    __capture_isfinite(_Tp __f) { return isfinite(__f); }
453
454  template<typename _Tp>
455    inline int
456    __capture_isinf(_Tp __f) { return isinf(__f); }
457
458  template<typename _Tp>
459    inline int
460    __capture_isnan(_Tp __f) { return isnan(__f); }
461
462  template<typename _Tp>
463    inline int
464    __capture_isnormal(_Tp __f) { return isnormal(__f); }
465
466  template<typename _Tp>
467    inline int
468    __capture_signbit(_Tp __f) { return signbit(__f); }
469
470  template<typename _Tp>
471    inline int
472    __capture_isgreater(_Tp __f1, _Tp __f2)
473    { return isgreater(__f1, __f2); }
474
475  template<typename _Tp>
476    inline int
477    __capture_isgreaterequal(_Tp __f1, _Tp __f2)
478    { return isgreaterequal(__f1, __f2); }
479
480  template<typename _Tp>
481    inline int
482    __capture_isless(_Tp __f1, _Tp __f2) { return isless(__f1, __f2); }
483
484  template<typename _Tp>
485    inline int
486    __capture_islessequal(_Tp __f1, _Tp __f2)
487    { return islessequal(__f1, __f2); }
488
489  template<typename _Tp>
490    inline int
491    __capture_islessgreater(_Tp __f1, _Tp __f2)
492    { return islessgreater(__f1, __f2); }
493
494  template<typename _Tp>
495    inline int
496    __capture_isunordered(_Tp __f1, _Tp __f2)
497    { return isunordered(__f1, __f2); }
498}
499
500// Only undefine the C99 FP macros, if actually captured for namespace movement
501#undef fpclassify
502#undef isfinite
503#undef isinf
504#undef isnan
505#undef isnormal
506#undef signbit
507#undef isgreater
508#undef isgreaterequal
509#undef isless
510#undef islessequal
511#undef islessgreater
512#undef isunordered
513#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
514#endif
515
516#if _GLIBCXX_USE_C99_MATH
517#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
518namespace __gnu_cxx
519{
520  template<typename _Tp>
521    inline int
522    fpclassify(_Tp __f) { return __capture_fpclassify(__f); }
523
524  template<typename _Tp>
525    inline int
526    isfinite(_Tp __f) { return __capture_isfinite(__f); }
527
528  template<typename _Tp>
529    inline int
530    isinf(_Tp __f) { return __capture_isinf(__f); }
531
532  template<typename _Tp>
533    inline int
534    isnan(_Tp __f) { return __capture_isnan(__f); }
535
536  template<typename _Tp>
537    inline int
538    isnormal(_Tp __f) { return __capture_isnormal(__f); }
539
540  template<typename _Tp>
541    inline int
542    signbit(_Tp __f) { return __capture_signbit(__f); }
543
544  template<typename _Tp>
545    inline int
546    isgreater(_Tp __f1, _Tp __f2) { return __capture_isgreater(__f1, __f2); }
547
548  template<typename _Tp>
549    inline int
550    isgreaterequal(_Tp __f1, _Tp __f2)
551    { return __capture_isgreaterequal(__f1, __f2); }
552
553  template<typename _Tp>
554    inline int
555    isless(_Tp __f1, _Tp __f2) { return __capture_isless(__f1, __f2); }
556
557  template<typename _Tp>
558    inline int
559    islessequal(_Tp __f1, _Tp __f2)
560    { return __capture_islessequal(__f1, __f2); }
561
562  template<typename _Tp>
563    inline int
564    islessgreater(_Tp __f1, _Tp __f2)
565    { return __capture_islessgreater(__f1, __f2); }
566
567  template<typename _Tp>
568    inline int
569    isunordered(_Tp __f1, _Tp __f2)
570    { return __capture_isunordered(__f1, __f2); }
571}
572
573namespace std
574{
575  using __gnu_cxx::fpclassify;
576  using __gnu_cxx::isfinite;
577  using __gnu_cxx::isinf;
578  using __gnu_cxx::isnan;
579  using __gnu_cxx::isnormal;
580  using __gnu_cxx::signbit;
581  using __gnu_cxx::isgreater;
582  using __gnu_cxx::isgreaterequal;
583  using __gnu_cxx::isless;
584  using __gnu_cxx::islessequal;
585  using __gnu_cxx::islessgreater;
586  using __gnu_cxx::isunordered;
587}
588#endif /* _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC */
589#endif
590
591#ifndef _GLIBCXX_EXPORT_TEMPLATE
592# include <bits/cmath.tcc>
593#endif
594
595#endif
596