OSDN Git Service

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