1169691Skan// TR1 cmath -*- C++ -*-
2169691Skan
3169691Skan// Copyright (C) 2006 Free Software Foundation, Inc.
4169691Skan//
5169691Skan// This file is part of the GNU ISO C++ Library.  This library is free
6169691Skan// software; you can redistribute it and/or modify it under the
7169691Skan// terms of the GNU General Public License as published by the
8169691Skan// Free Software Foundation; either version 2, or (at your option)
9169691Skan// any later version.
10169691Skan
11169691Skan// This library is distributed in the hope that it will be useful,
12169691Skan// but WITHOUT ANY WARRANTY; without even the implied warranty of
13169691Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14169691Skan// GNU General Public License for more details.
15169691Skan
16169691Skan// You should have received a copy of the GNU General Public License along
17169691Skan// with this library; see the file COPYING.  If not, write to the Free
18169691Skan// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19169691Skan// USA.
20169691Skan
21169691Skan// As a special exception, you may use this file as part of a free software
22169691Skan// library without restriction.  Specifically, if other files instantiate
23169691Skan// templates or use macros or inline functions from this file, or you compile
24169691Skan// this file and link it with other files to produce an executable, this
25169691Skan// file does not by itself cause the resulting executable to be covered by
26169691Skan// the GNU General Public License.  This exception does not however
27169691Skan// invalidate any other reasons why the executable file might be covered by
28169691Skan// the GNU General Public License.
29169691Skan
30169691Skan/** @file tr1/cmath
31169691Skan *  This is a TR1 C++ Library header. 
32169691Skan */
33169691Skan
34169691Skan#ifndef _TR1_CMATH
35169691Skan#define _TR1_CMATH 1
36169691Skan
37169691Skan#include <bits/c++config.h>
38169691Skan#include <cmath>
39169691Skan#include <tr1/common.h>
40169691Skan
41169691Skan#if _GLIBCXX_USE_C99_MATH_TR1
42169691Skan
43169691Skan#undef acosh
44169691Skan#undef acoshf
45169691Skan#undef acoshl
46169691Skan#undef asinh
47169691Skan#undef asinhf
48169691Skan#undef asinhl
49169691Skan#undef atanh
50169691Skan#undef atanhf
51169691Skan#undef atanhl
52169691Skan#undef cbrt
53169691Skan#undef cbrtf
54169691Skan#undef cbrtl
55169691Skan#undef copysign
56169691Skan#undef copysignf
57169691Skan#undef copysignl
58169691Skan#undef erf
59169691Skan#undef erff
60169691Skan#undef erfl
61169691Skan#undef erfc
62169691Skan#undef erfcf
63169691Skan#undef erfcl
64169691Skan#undef exp2
65169691Skan#undef exp2f
66169691Skan#undef exp2l
67169691Skan#undef expm1
68169691Skan#undef expm1f
69169691Skan#undef expm1l
70169691Skan#undef fdim
71169691Skan#undef fdimf
72169691Skan#undef fdiml
73169691Skan#undef fma
74169691Skan#undef fmaf
75169691Skan#undef fmal
76169691Skan#undef fmax
77169691Skan#undef fmaxf
78169691Skan#undef fmaxl
79169691Skan#undef fmin
80169691Skan#undef fminf
81169691Skan#undef fminl
82169691Skan#undef hypot
83169691Skan#undef hypotf
84169691Skan#undef hypotl
85169691Skan#undef ilogb
86169691Skan#undef ilogbf
87169691Skan#undef ilogbl
88169691Skan#undef lgamma
89169691Skan#undef lgammaf
90169691Skan#undef lgammal
91169691Skan#undef llrint
92169691Skan#undef llrintf
93169691Skan#undef llrintl
94169691Skan#undef llround
95169691Skan#undef llroundf
96169691Skan#undef llroundl
97169691Skan#undef log1p
98169691Skan#undef log1pf
99169691Skan#undef log1pl
100169691Skan#undef log2
101169691Skan#undef log2f
102169691Skan#undef log2l
103169691Skan#undef logb
104169691Skan#undef logbf
105169691Skan#undef logbl
106169691Skan#undef lrint
107169691Skan#undef lrintf
108169691Skan#undef lrintl
109169691Skan#undef lround
110169691Skan#undef lroundf
111169691Skan#undef lroundl
112169691Skan#undef nan
113169691Skan#undef nanf
114169691Skan#undef nanl
115169691Skan#undef nearbyint
116169691Skan#undef nearbyintf
117169691Skan#undef nearbyintl
118169691Skan#undef nextafter
119169691Skan#undef nextafterf
120169691Skan#undef nextafterl
121169691Skan#undef nexttoward
122169691Skan#undef nexttowardf
123169691Skan#undef nexttowardl
124169691Skan#undef remainder
125169691Skan#undef remainderf
126169691Skan#undef remainderl
127169691Skan#undef remquo
128169691Skan#undef remquo
129169691Skan#undef remquo
130169691Skan#undef rint
131169691Skan#undef rintf
132169691Skan#undef rintl
133169691Skan#undef round
134169691Skan#undef roundf
135169691Skan#undef roundl
136169691Skan#undef scalbln
137169691Skan#undef scalblnf
138169691Skan#undef scalblnl
139169691Skan#undef scalbn
140169691Skan#undef scalbnf
141169691Skan#undef scalbnl
142169691Skan#undef tgamma
143169691Skan#undef tgammaf
144169691Skan#undef tgammal
145169691Skan#undef trunc
146169691Skan#undef truncf
147169691Skan#undef truncl
148169691Skan
149169691Skan#endif
150169691Skan
151169691Skan// namespace std::tr1
152169691Skannamespace std
153169691Skan{
154169691Skan_GLIBCXX_BEGIN_NAMESPACE(tr1)
155169691Skan
156169691Skan#if _GLIBCXX_USE_C99_MATH_TR1
157169691Skan
158169691Skan  // types
159169691Skan  using ::double_t;
160169691Skan  using ::float_t;
161169691Skan
162169691Skan  // functions
163169691Skan  using ::acosh;
164169691Skan  using ::acoshf;
165169691Skan  using ::acoshl;
166169691Skan
167169691Skan  using ::asinh;
168169691Skan  using ::asinhf;
169169691Skan  using ::asinhl;
170169691Skan
171169691Skan  using ::atanh;
172169691Skan  using ::atanhf;
173169691Skan  using ::atanhl;
174169691Skan
175169691Skan  using ::cbrt;
176169691Skan  using ::cbrtf;
177169691Skan  using ::cbrtl;
178169691Skan
179169691Skan  using ::copysign;
180169691Skan  using ::copysignf;
181169691Skan  using ::copysignl;
182169691Skan
183169691Skan  using ::erf;
184169691Skan  using ::erff;
185169691Skan  using ::erfl;
186169691Skan
187169691Skan  using ::erfc;
188169691Skan  using ::erfcf;
189169691Skan  using ::erfcl;
190169691Skan
191169691Skan  using ::exp2;
192169691Skan  using ::exp2f;
193169691Skan  using ::exp2l;
194169691Skan
195169691Skan  using ::expm1;
196169691Skan  using ::expm1f;
197169691Skan  using ::expm1l;
198169691Skan
199169691Skan  using ::fdim;
200169691Skan  using ::fdimf;
201169691Skan  using ::fdiml;
202169691Skan
203169691Skan  using ::fma;
204169691Skan  using ::fmaf;
205169691Skan  using ::fmal;
206169691Skan
207169691Skan  using ::fmax;
208169691Skan  using ::fmaxf;
209169691Skan  using ::fmaxl;
210169691Skan
211169691Skan  using ::fmin;
212169691Skan  using ::fminf;
213169691Skan  using ::fminl;
214169691Skan
215169691Skan  using ::hypot;
216169691Skan  using ::hypotf;
217169691Skan  using ::hypotl;
218169691Skan
219169691Skan  using ::ilogb;
220169691Skan  using ::ilogbf;
221169691Skan  using ::ilogbl;
222169691Skan
223169691Skan  using ::lgamma;
224169691Skan  using ::lgammaf;
225169691Skan  using ::lgammal;
226169691Skan
227169691Skan  using ::llrint;
228169691Skan  using ::llrintf;
229169691Skan  using ::llrintl;
230169691Skan
231169691Skan  using ::llround;
232169691Skan  using ::llroundf;
233169691Skan  using ::llroundl;
234169691Skan
235169691Skan  using ::log1p;
236169691Skan  using ::log1pf;
237169691Skan  using ::log1pl;
238169691Skan
239169691Skan  using ::log2;
240169691Skan  using ::log2f;
241169691Skan  using ::log2l;
242169691Skan
243169691Skan  using ::logb;
244169691Skan  using ::logbf;
245169691Skan  using ::logbl;
246169691Skan
247169691Skan  using ::lrint;
248169691Skan  using ::lrintf;
249169691Skan  using ::lrintl;
250169691Skan
251169691Skan  using ::lround;
252169691Skan  using ::lroundf;
253169691Skan  using ::lroundl;
254169691Skan
255169691Skan  using ::nan;
256169691Skan  using ::nanf;
257169691Skan  using ::nanl;
258169691Skan
259169691Skan  using ::nearbyint;
260169691Skan  using ::nearbyintf;
261169691Skan  using ::nearbyintl;
262169691Skan
263169691Skan  using ::nextafter;
264169691Skan  using ::nextafterf;
265169691Skan  using ::nextafterl;
266169691Skan
267169691Skan  using ::nexttoward;
268169691Skan  using ::nexttowardf;
269169691Skan  using ::nexttowardl;
270169691Skan
271169691Skan  using ::remainder;
272169691Skan  using ::remainderf;
273169691Skan  using ::remainderl;
274169691Skan
275169691Skan  using ::remquo;
276169691Skan  using ::remquo;
277169691Skan  using ::remquo;
278169691Skan
279169691Skan  using ::rint;
280169691Skan  using ::rintf;
281169691Skan  using ::rintl;
282169691Skan
283169691Skan  using ::round;
284169691Skan  using ::roundf;
285169691Skan  using ::roundl;
286169691Skan
287169691Skan  using ::scalbln;
288169691Skan  using ::scalblnf;
289169691Skan  using ::scalblnl;
290169691Skan
291169691Skan  using ::scalbn;
292169691Skan  using ::scalbnf;
293169691Skan  using ::scalbnl;
294169691Skan
295169691Skan  using ::tgamma;
296169691Skan  using ::tgammaf;
297169691Skan  using ::tgammal;
298169691Skan
299169691Skan  using ::trunc;
300169691Skan  using ::truncf;
301169691Skan  using ::truncl;
302169691Skan
303169691Skan#endif
304169691Skan
305169691Skan#if _GLIBCXX_USE_C99_MATH
306169691Skan#if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
307169691Skan
308169691Skan  /// @brief Function template definitions [8.16.3].
309169691Skan  //
310169691Skan  using std::signbit;
311169691Skan  
312169691Skan  using std::fpclassify;
313169691Skan
314169691Skan  using std::isfinite;
315169691Skan  using std::isinf;
316169691Skan  using std::isnan;
317169691Skan  using std::isnormal;
318169691Skan
319169691Skan  using std::isgreater;
320169691Skan  using std::isgreaterequal;
321169691Skan  using std::isless;
322169691Skan  using std::islessequal;
323169691Skan  using std::islessgreater;
324169691Skan  using std::isunordered;
325169691Skan#endif
326169691Skan#endif
327169691Skan
328169691Skan#if _GLIBCXX_USE_C99_MATH_TR1
329169691Skan
330169691Skan  /// @brief Additional overloads [8.16.4].
331169691Skan  //
332169691Skan  using std::acos;
333169691Skan
334169691Skan  inline float
335169691Skan  acosh(float __x)
336169691Skan  { return __builtin_acoshf(__x); }
337169691Skan
338169691Skan  inline long double
339169691Skan  acosh(long double __x)
340169691Skan  { return __builtin_acoshl(__x); }
341169691Skan
342169691Skan  template<typename _Tp>
343169691Skan    inline typename __promote<_Tp>::__type 
344169691Skan    acosh(_Tp __x)
345169691Skan    {
346169691Skan      typedef typename __promote<_Tp>::__type __type;
347169691Skan      return acosh(__type(__x));
348169691Skan    }
349169691Skan
350169691Skan  using std::asin;
351169691Skan
352169691Skan  inline float
353169691Skan  asinh(float __x)
354169691Skan  { return __builtin_asinhf(__x); }
355169691Skan
356169691Skan  inline long double
357169691Skan  asinh(long double __x)
358169691Skan  { return __builtin_asinhl(__x); }
359169691Skan
360169691Skan  template<typename _Tp>
361169691Skan    inline typename __promote<_Tp>::__type 
362169691Skan    asinh(_Tp __x)
363169691Skan    {
364169691Skan      typedef typename __promote<_Tp>::__type __type;
365169691Skan      return asinh(__type(__x));
366169691Skan    }
367169691Skan
368169691Skan  using std::atan;
369169691Skan
370169691Skan  // Workaround for c++/21682.
371169691Skan  namespace __detail
372169691Skan  {
373169691Skan    template<typename _Tp, typename _Up>
374169691Skan      inline typename
375169691Skan      __gnu_cxx::__enable_if<std::__is_floating<_Tp>::__value
376169691Skan                             || std::__is_floating<_Up>::__value,
377169691Skan			     typename
378169691Skan			     std::tr1::__promote_2<_Tp, _Up>::__type>::__type
379169691Skan      atan2(_Tp __y, _Up __x)
380169691Skan      {
381169691Skan	typedef typename std::tr1::__promote_2<_Tp, _Up>::__type __type;
382169691Skan	return std::atan2(__type(__y), __type(__x));
383169691Skan      }
384169691Skan  } // namespace __detail
385169691Skan
386169691Skan  using std::atan2;
387169691Skan  using __detail::atan2;
388169691Skan 
389169691Skan  inline float
390169691Skan  atanh(float __x)
391169691Skan  { return __builtin_atanhf(__x); }
392169691Skan
393169691Skan  inline long double
394169691Skan  atanh(long double __x)
395169691Skan  { return __builtin_atanhl(__x); }
396169691Skan
397169691Skan  template<typename _Tp>
398169691Skan    inline typename __promote<_Tp>::__type 
399169691Skan    atanh(_Tp __x)
400169691Skan    {
401169691Skan      typedef typename __promote<_Tp>::__type __type;
402169691Skan      return atanh(__type(__x));
403169691Skan    }
404169691Skan
405169691Skan  inline float
406169691Skan  cbrt(float __x)
407169691Skan  { return __builtin_cbrtf(__x); }
408169691Skan
409169691Skan  inline long double
410169691Skan  cbrt(long double __x)
411169691Skan  { return __builtin_cbrtl(__x); }
412169691Skan
413169691Skan  template<typename _Tp>
414169691Skan    inline typename __promote<_Tp>::__type 
415169691Skan    cbrt(_Tp __x)
416169691Skan    {
417169691Skan      typedef typename __promote<_Tp>::__type __type;
418169691Skan      return cbrt(__type(__x));
419169691Skan    }
420169691Skan
421169691Skan  using std::ceil;
422169691Skan
423169691Skan  inline float
424169691Skan  copysign(float __x, float __y)
425169691Skan  { return __builtin_copysignf(__x, __y); }
426169691Skan
427169691Skan  inline long double
428169691Skan  copysign(long double __x, long double __y)
429169691Skan  { return __builtin_copysignl(__x, __y); }
430169691Skan
431169691Skan  template<typename _Tp, typename _Up>
432169691Skan    inline typename __promote_2<_Tp, _Up>::__type
433169691Skan    copysign(_Tp __x, _Up __y)
434169691Skan    {
435169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
436169691Skan      return copysign(__type(__x), __type(__y));
437169691Skan    }
438169691Skan
439169691Skan  using std::cos;
440169691Skan  using std::cosh;  
441169691Skan
442169691Skan  inline float
443169691Skan  erf(float __x)
444169691Skan  { return __builtin_erff(__x); }
445169691Skan
446169691Skan  inline long double
447169691Skan  erf(long double __x)
448169691Skan  { return __builtin_erfl(__x); }
449169691Skan
450169691Skan  template<typename _Tp>
451169691Skan    inline typename __promote<_Tp>::__type 
452169691Skan    erf(_Tp __x)
453169691Skan    {
454169691Skan      typedef typename __promote<_Tp>::__type __type;
455169691Skan      return erf(__type(__x));
456169691Skan    }
457169691Skan
458169691Skan  inline float
459169691Skan  erfc(float __x)
460169691Skan  { return __builtin_erfcf(__x); }
461169691Skan
462169691Skan  inline long double
463169691Skan  erfc(long double __x)
464169691Skan  { return __builtin_erfcl(__x); }
465169691Skan
466169691Skan  template<typename _Tp>
467169691Skan    inline typename __promote<_Tp>::__type 
468169691Skan    erfc(_Tp __x)
469169691Skan    {
470169691Skan      typedef typename __promote<_Tp>::__type __type;
471169691Skan      return erfc(__type(__x));
472169691Skan    }
473169691Skan
474169691Skan  using std::exp;
475169691Skan
476169691Skan  inline float
477169691Skan  exp2(float __x)
478169691Skan  { return __builtin_exp2f(__x); }
479169691Skan
480169691Skan  inline long double
481169691Skan  exp2(long double __x)
482169691Skan  { return __builtin_exp2l(__x); }
483169691Skan
484169691Skan  template<typename _Tp>
485169691Skan    inline typename __promote<_Tp>::__type 
486169691Skan    exp2(_Tp __x)
487169691Skan    {
488169691Skan      typedef typename __promote<_Tp>::__type __type;
489169691Skan      return exp2(__type(__x));
490169691Skan    }
491169691Skan
492169691Skan  inline float
493169691Skan  expm1(float __x)
494169691Skan  { return __builtin_expm1f(__x); }
495169691Skan
496169691Skan  inline long double
497169691Skan  expm1(long double __x)
498169691Skan  { return __builtin_expm1l(__x); }
499169691Skan
500169691Skan  template<typename _Tp>
501169691Skan    inline typename __promote<_Tp>::__type 
502169691Skan    expm1(_Tp __x)
503169691Skan    {
504169691Skan      typedef typename __promote<_Tp>::__type __type;
505169691Skan      return expm1(__type(__x));
506169691Skan    }
507169691Skan
508169691Skan  using std::fabs;
509169691Skan
510169691Skan  inline float
511169691Skan  fdim(float __x, float __y)
512169691Skan  { return __builtin_fdimf(__x, __y); }
513169691Skan
514169691Skan  inline long double
515169691Skan  fdim(long double __x, long double __y)
516169691Skan  { return __builtin_fdiml(__x, __y); }
517169691Skan
518169691Skan  template<typename _Tp, typename _Up>
519169691Skan    inline typename __promote_2<_Tp, _Up>::__type
520169691Skan    fdim(_Tp __x, _Up __y)
521169691Skan    {
522169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
523169691Skan      return fdim(__type(__x), __type(__y));
524169691Skan    }
525169691Skan
526169691Skan  using std::floor;
527169691Skan
528169691Skan  inline float
529169691Skan  fma(float __x, float __y, float __z)
530169691Skan  { return __builtin_fmaf(__x, __y, __z); }
531169691Skan
532169691Skan  inline long double
533169691Skan  fma(long double __x, long double __y, long double __z)
534169691Skan  { return __builtin_fmal(__x, __y, __z); }
535169691Skan
536169691Skan  template<typename _Tp, typename _Up, typename _Vp>
537169691Skan    inline typename __promote_3<_Tp, _Up, _Vp>::__type
538169691Skan    fma(_Tp __x, _Up __y, _Vp __z)
539169691Skan    {
540169691Skan      typedef typename __promote_3<_Tp, _Up, _Vp>::__type __type;
541169691Skan      return fma(__type(__x), __type(__y), __type(__z));
542169691Skan    }
543169691Skan
544169691Skan  inline float
545169691Skan  fmax(float __x, float __y)
546169691Skan  { return __builtin_fmaxf(__x, __y); }
547169691Skan
548169691Skan  inline long double
549169691Skan  fmax(long double __x, long double __y)
550169691Skan  { return __builtin_fmaxl(__x, __y); }
551169691Skan
552169691Skan  template<typename _Tp, typename _Up>
553169691Skan    inline typename __promote_2<_Tp, _Up>::__type
554169691Skan    fmax(_Tp __x, _Up __y)
555169691Skan    {
556169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
557169691Skan      return fmax(__type(__x), __type(__y));
558169691Skan    }
559169691Skan
560169691Skan  inline float
561169691Skan  fmin(float __x, float __y)
562169691Skan  { return __builtin_fminf(__x, __y); }
563169691Skan
564169691Skan  inline long double
565169691Skan  fmin(long double __x, long double __y)
566169691Skan  { return __builtin_fminl(__x, __y); }
567169691Skan
568169691Skan  template<typename _Tp, typename _Up>
569169691Skan    inline typename __promote_2<_Tp, _Up>::__type
570169691Skan    fmin(_Tp __x, _Up __y)
571169691Skan    {
572169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
573169691Skan      return fmin(__type(__x), __type(__y));
574169691Skan    }
575169691Skan
576169691Skan  using std::fmod;
577169691Skan  using std::frexp;
578169691Skan
579169691Skan  inline float
580169691Skan  hypot(float __x, float __y)
581169691Skan  { return __builtin_hypotf(__x, __y); }
582169691Skan
583169691Skan  inline long double
584169691Skan  hypot(long double __x, long double __y)
585169691Skan  { return __builtin_hypotl(__x, __y); }
586169691Skan
587169691Skan  template<typename _Tp, typename _Up>
588169691Skan    inline typename __promote_2<_Tp, _Up>::__type
589169691Skan    hypot(_Tp __x, _Up __y)
590169691Skan    {
591169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
592169691Skan      return hypot(__type(__x), __type(__y));
593169691Skan    }
594169691Skan
595169691Skan  inline int
596169691Skan  ilogb(float __x)
597169691Skan  { return __builtin_ilogbf(__x); }
598169691Skan
599169691Skan  inline int
600169691Skan  ilogb(long double __x)
601169691Skan  { return __builtin_ilogbl(__x); }
602169691Skan
603169691Skan  template<typename _Tp>
604169691Skan    inline int
605169691Skan    ilogb(_Tp __x)
606169691Skan    {
607169691Skan      typedef typename __promote<_Tp>::__type __type;
608169691Skan      return ilogb(__type(__x));
609169691Skan    }
610169691Skan
611169691Skan  using std::ldexp;
612169691Skan
613169691Skan  inline float
614169691Skan  lgamma(float __x)
615169691Skan  { return __builtin_lgammaf(__x); }
616169691Skan
617169691Skan  inline long double
618169691Skan  lgamma(long double __x)
619169691Skan  { return __builtin_lgammal(__x); }
620169691Skan
621169691Skan  template<typename _Tp>
622169691Skan    inline typename __promote<_Tp>::__type 
623169691Skan    lgamma(_Tp __x)
624169691Skan    {
625169691Skan      typedef typename __promote<_Tp>::__type __type;
626169691Skan      return lgamma(__type(__x));
627169691Skan    }
628169691Skan
629169691Skan  inline long long
630169691Skan  llrint(float __x)
631169691Skan  { return __builtin_llrintf(__x); }
632169691Skan
633169691Skan  inline long long
634169691Skan  llrint(long double __x)
635169691Skan  { return __builtin_llrintl(__x); }
636169691Skan
637169691Skan  template<typename _Tp>
638169691Skan    inline long long
639169691Skan    llrint(_Tp __x)
640169691Skan    {
641169691Skan      typedef typename __promote<_Tp>::__type __type;
642169691Skan      return llrint(__type(__x));
643169691Skan    }
644169691Skan
645169691Skan  inline long long
646169691Skan  llround(float __x)
647169691Skan  { return __builtin_llroundf(__x); }
648169691Skan
649169691Skan  inline long long
650169691Skan  llround(long double __x)
651169691Skan  { return __builtin_llroundl(__x); }
652169691Skan
653169691Skan  template<typename _Tp>
654169691Skan    inline long long
655169691Skan    llround(_Tp __x)
656169691Skan    {
657169691Skan      typedef typename __promote<_Tp>::__type __type;
658169691Skan      return llround(__type(__x));
659169691Skan    }
660169691Skan
661169691Skan  using std::log;
662169691Skan  using std::log10;
663169691Skan
664169691Skan  inline float
665169691Skan  log1p(float __x)
666169691Skan  { return __builtin_log1pf(__x); }
667169691Skan
668169691Skan  inline long double
669169691Skan  log1p(long double __x)
670169691Skan  { return __builtin_log1pl(__x); }
671169691Skan
672169691Skan  template<typename _Tp>
673169691Skan    inline typename __promote<_Tp>::__type 
674169691Skan    log1p(_Tp __x)
675169691Skan    {
676169691Skan      typedef typename __promote<_Tp>::__type __type;
677169691Skan      return log1p(__type(__x));
678169691Skan    }
679169691Skan
680169691Skan  // DR 568.
681169691Skan  inline float
682169691Skan  log2(float __x)
683169691Skan  { return __builtin_log2f(__x); }
684169691Skan
685169691Skan  inline long double
686169691Skan  log2(long double __x)
687169691Skan  { return __builtin_log2l(__x); }
688169691Skan
689169691Skan  template<typename _Tp>
690169691Skan    inline typename __promote<_Tp>::__type 
691169691Skan    log2(_Tp __x)
692169691Skan    {
693169691Skan      typedef typename __promote<_Tp>::__type __type;
694169691Skan      return log2(__type(__x));
695169691Skan    }
696169691Skan
697169691Skan  inline float
698169691Skan  logb(float __x)
699169691Skan  { return __builtin_logbf(__x); }
700169691Skan
701169691Skan  inline long double
702169691Skan  logb(long double __x)
703169691Skan  { return __builtin_logbl(__x); }
704169691Skan
705169691Skan  template<typename _Tp>
706169691Skan    inline typename __promote<_Tp>::__type 
707169691Skan    logb(_Tp __x)
708169691Skan    {
709169691Skan      typedef typename __promote<_Tp>::__type __type;
710169691Skan      return logb(__type(__x));
711169691Skan    }
712169691Skan
713169691Skan  inline long
714169691Skan  lrint(float __x)
715169691Skan  { return __builtin_lrintf(__x); }
716169691Skan
717169691Skan  inline long
718169691Skan  lrint(long double __x)
719169691Skan  { return __builtin_lrintl(__x); }
720169691Skan
721169691Skan  template<typename _Tp>
722169691Skan    inline long
723169691Skan    lrint(_Tp __x)
724169691Skan    {
725169691Skan      typedef typename __promote<_Tp>::__type __type;
726169691Skan      return lrint(__type(__x));
727169691Skan    }
728169691Skan
729169691Skan  inline long
730169691Skan  lround(float __x)
731169691Skan  { return __builtin_lroundf(__x); }
732169691Skan
733169691Skan  inline long
734169691Skan  lround(long double __x)
735169691Skan  { return __builtin_lroundl(__x); }
736169691Skan
737169691Skan  template<typename _Tp>
738169691Skan    inline long
739169691Skan    lround(_Tp __x)
740169691Skan    {
741169691Skan      typedef typename __promote<_Tp>::__type __type;
742169691Skan      return lround(__type(__x));
743169691Skan    }
744169691Skan
745169691Skan  inline float
746169691Skan  nearbyint(float __x)
747169691Skan  { return __builtin_nearbyintf(__x); }
748169691Skan
749169691Skan  inline long double
750169691Skan  nearbyint(long double __x)
751169691Skan  { return __builtin_nearbyintl(__x); }
752169691Skan
753169691Skan  template<typename _Tp>
754169691Skan    inline typename __promote<_Tp>::__type 
755169691Skan    nearbyint(_Tp __x)
756169691Skan    {
757169691Skan      typedef typename __promote<_Tp>::__type __type;
758169691Skan      return nearbyint(__type(__x));
759169691Skan    }
760169691Skan
761169691Skan  inline float
762169691Skan  nextafter(float __x, float __y)
763169691Skan  { return __builtin_nextafterf(__x, __y); }
764169691Skan
765169691Skan  inline long double
766169691Skan  nextafter(long double __x, long double __y)
767169691Skan  { return __builtin_nextafterl(__x, __y); }
768169691Skan
769169691Skan  template<typename _Tp, typename _Up>
770169691Skan    inline typename __promote_2<_Tp, _Up>::__type
771169691Skan    nextafter(_Tp __x, _Up __y)
772169691Skan    {
773169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
774169691Skan      return nextafter(__type(__x), __type(__y));
775169691Skan    }
776169691Skan
777169691Skan  inline float
778169691Skan  nexttoward(float __x, long double __y)
779169691Skan  { return __builtin_nexttowardf(__x, __y); }
780169691Skan
781169691Skan  inline long double
782169691Skan  nexttoward(long double __x, long double __y)
783169691Skan  { return __builtin_nexttowardl(__x, __y); }
784169691Skan
785169691Skan  template<typename _Tp>
786169691Skan    inline typename __promote<_Tp>::__type
787169691Skan    nexttoward(_Tp __x, long double __y)
788169691Skan    {
789169691Skan      typedef typename __promote<_Tp>::__type __type;
790169691Skan      return nexttoward(__type(__x), __y);
791169691Skan    }
792169691Skan
793169691Skan  using std::pow;
794169691Skan
795169691Skan  // DR 550.
796169691Skan  template<typename _Tp, typename _Up>
797169691Skan    inline typename __promote_2<_Tp, _Up>::__type
798169691Skan    pow(_Tp __x, _Up __y)
799169691Skan    {
800169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
801169691Skan      return pow(__type(__x), __type(__y));
802169691Skan    }
803169691Skan
804169691Skan  inline float
805169691Skan  remainder(float __x, float __y)
806169691Skan  { return __builtin_remainderf(__x, __y); }
807169691Skan
808169691Skan  inline long double
809169691Skan  remainder(long double __x, long double __y)
810169691Skan  { return __builtin_remainderl(__x, __y); }
811169691Skan
812169691Skan  template<typename _Tp, typename _Up>
813169691Skan    inline typename __promote_2<_Tp, _Up>::__type
814169691Skan    remainder(_Tp __x, _Up __y)
815169691Skan    {
816169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
817169691Skan      return remainder(__type(__x), __type(__y));
818169691Skan    }
819169691Skan
820169691Skan  inline float
821169691Skan  remquo(float __x, float __y, int* __pquo)
822169691Skan  { return __builtin_remquof(__x, __y, __pquo); }
823169691Skan
824169691Skan  inline long double
825169691Skan  remquo(long double __x, long double __y, int* __pquo)
826169691Skan  { return __builtin_remquol(__x, __y, __pquo); }
827169691Skan
828169691Skan  template<typename _Tp, typename _Up>
829169691Skan    inline typename __promote_2<_Tp, _Up>::__type
830169691Skan    remquo(_Tp __x, _Up __y, int* __pquo)
831169691Skan    {
832169691Skan      typedef typename __promote_2<_Tp, _Up>::__type __type;
833169691Skan      return remquo(__type(__x), __type(__y), __pquo);
834169691Skan    }
835169691Skan
836169691Skan  inline float
837169691Skan  rint(float __x)
838169691Skan  { return __builtin_rintf(__x); }
839169691Skan
840169691Skan  inline long double
841169691Skan  rint(long double __x)
842169691Skan  { return __builtin_rintl(__x); }
843169691Skan
844169691Skan  template<typename _Tp>
845169691Skan    inline typename __promote<_Tp>::__type
846169691Skan    rint(_Tp __x)
847169691Skan    {
848169691Skan      typedef typename __promote<_Tp>::__type __type;
849169691Skan      return rint(__type(__x));
850169691Skan    }
851169691Skan
852169691Skan  inline float
853169691Skan  round(float __x)
854169691Skan  { return __builtin_roundf(__x); }
855169691Skan
856169691Skan  inline long double
857169691Skan  round(long double __x)
858169691Skan  { return __builtin_roundl(__x); }
859169691Skan
860169691Skan  template<typename _Tp>
861169691Skan    inline typename __promote<_Tp>::__type
862169691Skan    round(_Tp __x)
863169691Skan    {
864169691Skan      typedef typename __promote<_Tp>::__type __type;
865169691Skan      return round(__type(__x));
866169691Skan    }
867169691Skan
868169691Skan  inline float
869169691Skan  scalbln(float __x, long __ex)
870169691Skan  { return __builtin_scalblnf(__x, __ex); }
871169691Skan
872169691Skan  inline long double
873169691Skan  scalbln(long double __x, long __ex)
874169691Skan  { return __builtin_scalblnl(__x, __ex); }
875169691Skan
876169691Skan  template<typename _Tp>
877169691Skan    inline typename __promote<_Tp>::__type 
878169691Skan    scalbln(_Tp __x, long __ex)
879169691Skan    {
880169691Skan      typedef typename __promote<_Tp>::__type __type;
881169691Skan      return scalbln(__type(__x), __ex);
882169691Skan    }
883169691Skan 
884169691Skan  inline float
885169691Skan  scalbn(float __x, int __ex)
886169691Skan  { return __builtin_scalbnf(__x, __ex); }
887169691Skan
888169691Skan  inline long double
889169691Skan  scalbn(long double __x, int __ex)
890169691Skan  { return __builtin_scalbnl(__x, __ex); }
891169691Skan
892169691Skan  template<typename _Tp>
893169691Skan    inline typename __promote<_Tp>::__type 
894169691Skan    scalbn(_Tp __x, int __ex)
895169691Skan    {
896169691Skan      typedef typename __promote<_Tp>::__type __type;
897169691Skan      return scalbn(__type(__x), __ex);
898169691Skan    }
899169691Skan
900169691Skan  using std::sin;
901169691Skan  using std::sinh;
902169691Skan  using std::sqrt;
903169691Skan  using std::tan;
904169691Skan  using std::tanh;
905169691Skan
906169691Skan  inline float
907169691Skan  tgamma(float __x)
908169691Skan  { return __builtin_tgammaf(__x); }
909169691Skan
910169691Skan  inline long double
911169691Skan  tgamma(long double __x)
912169691Skan  { return __builtin_tgammal(__x); }
913169691Skan
914169691Skan  template<typename _Tp>
915169691Skan    inline typename __promote<_Tp>::__type 
916169691Skan    tgamma(_Tp __x)
917169691Skan    {
918169691Skan      typedef typename __promote<_Tp>::__type __type;
919169691Skan      return tgamma(__type(__x));
920169691Skan    }
921169691Skan 
922169691Skan  inline float
923169691Skan  trunc(float __x)
924169691Skan  { return __builtin_truncf(__x); }
925169691Skan
926169691Skan  inline long double
927169691Skan  trunc(long double __x)
928169691Skan  { return __builtin_truncl(__x); }
929169691Skan
930169691Skan  template<typename _Tp>
931169691Skan    inline typename __promote<_Tp>::__type 
932169691Skan    trunc(_Tp __x)
933169691Skan    {
934169691Skan      typedef typename __promote<_Tp>::__type __type;
935169691Skan      return trunc(__type(__x));
936169691Skan    }
937169691Skan
938169691Skan#endif
939169691Skan
940169691Skan_GLIBCXX_END_NAMESPACE
941169691Skan}
942169691Skan
943169691Skan#endif
944