00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #pragma GCC system_header
00042
00043 #include <bits/c++config.h>
00044 #include <bits/cpp_type_traits.h>
00045 #include <ext/type_traits.h>
00046 #include <math.h>
00047
00048 #ifndef _GLIBCXX_CMATH
00049 #define _GLIBCXX_CMATH 1
00050
00051
00052 #undef abs
00053 #undef div
00054 #undef acos
00055 #undef asin
00056 #undef atan
00057 #undef atan2
00058 #undef ceil
00059 #undef cos
00060 #undef cosh
00061 #undef exp
00062 #undef fabs
00063 #undef floor
00064 #undef fmod
00065 #undef frexp
00066 #undef ldexp
00067 #undef log
00068 #undef log10
00069 #undef modf
00070 #undef pow
00071 #undef sin
00072 #undef sinh
00073 #undef sqrt
00074 #undef tan
00075 #undef tanh
00076
00077 _GLIBCXX_BEGIN_NAMESPACE(std)
00078
00079
00080
00081 template<typename _Tp>
00082 _Tp __cmath_power(_Tp, unsigned int);
00083
00084 template<typename _Tp>
00085 inline _Tp
00086 __pow_helper(_Tp __x, int __n)
00087 {
00088 return __n < 0
00089 ? _Tp(1)/__cmath_power(__x, -__n)
00090 : __cmath_power(__x, __n);
00091 }
00092
00093 inline double
00094 abs(double __x)
00095 { return __builtin_fabs(__x); }
00096
00097 inline float
00098 abs(float __x)
00099 { return __builtin_fabsf(__x); }
00100
00101 inline long double
00102 abs(long double __x)
00103 { return __builtin_fabsl(__x); }
00104
00105 using ::acos;
00106
00107 inline float
00108 acos(float __x)
00109 { return __builtin_acosf(__x); }
00110
00111 inline long double
00112 acos(long double __x)
00113 { return __builtin_acosl(__x); }
00114
00115 template<typename _Tp>
00116 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00117 double>::__type
00118 acos(_Tp __x)
00119 { return __builtin_acos(__x); }
00120
00121 using ::asin;
00122
00123 inline float
00124 asin(float __x)
00125 { return __builtin_asinf(__x); }
00126
00127 inline long double
00128 asin(long double __x)
00129 { return __builtin_asinl(__x); }
00130
00131 template<typename _Tp>
00132 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00133 double>::__type
00134 asin(_Tp __x)
00135 { return __builtin_asin(__x); }
00136
00137 using ::atan;
00138
00139 inline float
00140 atan(float __x)
00141 { return __builtin_atanf(__x); }
00142
00143 inline long double
00144 atan(long double __x)
00145 { return __builtin_atanl(__x); }
00146
00147 template<typename _Tp>
00148 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00149 double>::__type
00150 atan(_Tp __x)
00151 { return __builtin_atan(__x); }
00152
00153 using ::atan2;
00154
00155 inline float
00156 atan2(float __y, float __x)
00157 { return __builtin_atan2f(__y, __x); }
00158
00159 inline long double
00160 atan2(long double __y, long double __x)
00161 { return __builtin_atan2l(__y, __x); }
00162
00163 template<typename _Tp, typename _Up>
00164 inline
00165 typename __gnu_cxx::__promote_2<
00166 typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
00167 && __is_arithmetic<_Up>::__value,
00168 _Tp>::__type, _Up>::__type
00169 atan2(_Tp __y, _Up __x)
00170 {
00171 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
00172 return atan2(__type(__y), __type(__x));
00173 }
00174
00175 using ::ceil;
00176
00177 inline float
00178 ceil(float __x)
00179 { return __builtin_ceilf(__x); }
00180
00181 inline long double
00182 ceil(long double __x)
00183 { return __builtin_ceill(__x); }
00184
00185 template<typename _Tp>
00186 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00187 double>::__type
00188 ceil(_Tp __x)
00189 { return __builtin_ceil(__x); }
00190
00191 using ::cos;
00192
00193 inline float
00194 cos(float __x)
00195 { return __builtin_cosf(__x); }
00196
00197 inline long double
00198 cos(long double __x)
00199 { return __builtin_cosl(__x); }
00200
00201 template<typename _Tp>
00202 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00203 double>::__type
00204 cos(_Tp __x)
00205 { return __builtin_cos(__x); }
00206
00207 using ::cosh;
00208
00209 inline float
00210 cosh(float __x)
00211 { return __builtin_coshf(__x); }
00212
00213 inline long double
00214 cosh(long double __x)
00215 { return __builtin_coshl(__x); }
00216
00217 template<typename _Tp>
00218 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00219 double>::__type
00220 cosh(_Tp __x)
00221 { return __builtin_cosh(__x); }
00222
00223 using ::exp;
00224
00225 inline float
00226 exp(float __x)
00227 { return __builtin_expf(__x); }
00228
00229 inline long double
00230 exp(long double __x)
00231 { return __builtin_expl(__x); }
00232
00233 template<typename _Tp>
00234 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00235 double>::__type
00236 exp(_Tp __x)
00237 { return __builtin_exp(__x); }
00238
00239 using ::fabs;
00240
00241 inline float
00242 fabs(float __x)
00243 { return __builtin_fabsf(__x); }
00244
00245 inline long double
00246 fabs(long double __x)
00247 { return __builtin_fabsl(__x); }
00248
00249 template<typename _Tp>
00250 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00251 double>::__type
00252 fabs(_Tp __x)
00253 { return __builtin_fabs(__x); }
00254
00255 using ::floor;
00256
00257 inline float
00258 floor(float __x)
00259 { return __builtin_floorf(__x); }
00260
00261 inline long double
00262 floor(long double __x)
00263 { return __builtin_floorl(__x); }
00264
00265 template<typename _Tp>
00266 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00267 double>::__type
00268 floor(_Tp __x)
00269 { return __builtin_floor(__x); }
00270
00271 using ::fmod;
00272
00273 inline float
00274 fmod(float __x, float __y)
00275 { return __builtin_fmodf(__x, __y); }
00276
00277 inline long double
00278 fmod(long double __x, long double __y)
00279 { return __builtin_fmodl(__x, __y); }
00280
00281 using ::frexp;
00282
00283 inline float
00284 frexp(float __x, int* __exp)
00285 { return __builtin_frexpf(__x, __exp); }
00286
00287 inline long double
00288 frexp(long double __x, int* __exp)
00289 { return __builtin_frexpl(__x, __exp); }
00290
00291 template<typename _Tp>
00292 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00293 double>::__type
00294 frexp(_Tp __x, int* __exp)
00295 { return __builtin_frexp(__x, __exp); }
00296
00297 using ::ldexp;
00298
00299 inline float
00300 ldexp(float __x, int __exp)
00301 { return __builtin_ldexpf(__x, __exp); }
00302
00303 inline long double
00304 ldexp(long double __x, int __exp)
00305 { return __builtin_ldexpl(__x, __exp); }
00306
00307 template<typename _Tp>
00308 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00309 double>::__type
00310 ldexp(_Tp __x, int __exp)
00311 { return __builtin_ldexp(__x, __exp); }
00312
00313 using ::log;
00314
00315 inline float
00316 log(float __x)
00317 { return __builtin_logf(__x); }
00318
00319 inline long double
00320 log(long double __x)
00321 { return __builtin_logl(__x); }
00322
00323 template<typename _Tp>
00324 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00325 double>::__type
00326 log(_Tp __x)
00327 { return __builtin_log(__x); }
00328
00329 using ::log10;
00330
00331 inline float
00332 log10(float __x)
00333 { return __builtin_log10f(__x); }
00334
00335 inline long double
00336 log10(long double __x)
00337 { return __builtin_log10l(__x); }
00338
00339 template<typename _Tp>
00340 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00341 double>::__type
00342 log10(_Tp __x)
00343 { return __builtin_log10(__x); }
00344
00345 using ::modf;
00346
00347 inline float
00348 modf(float __x, float* __iptr)
00349 { return __builtin_modff(__x, __iptr); }
00350
00351 inline long double
00352 modf(long double __x, long double* __iptr)
00353 { return __builtin_modfl(__x, __iptr); }
00354
00355 using ::pow;
00356
00357 inline float
00358 pow(float __x, float __y)
00359 { return __builtin_powf(__x, __y); }
00360
00361 inline long double
00362 pow(long double __x, long double __y)
00363 { return __builtin_powl(__x, __y); }
00364
00365 #ifndef __GXX_EXPERIMENTAL_CXX0X__
00366
00367
00368 inline double
00369 pow(double __x, int __i)
00370 { return __builtin_powi(__x, __i); }
00371
00372 inline float
00373 pow(float __x, int __n)
00374 { return __builtin_powif(__x, __n); }
00375
00376 inline long double
00377 pow(long double __x, int __n)
00378 { return __builtin_powil(__x, __n); }
00379 #endif
00380
00381 template<typename _Tp, typename _Up>
00382 inline
00383 typename __gnu_cxx::__promote_2<
00384 typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value
00385 && __is_arithmetic<_Up>::__value,
00386 _Tp>::__type, _Up>::__type
00387 pow(_Tp __x, _Up __y)
00388 {
00389 typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
00390 return pow(__type(__x), __type(__y));
00391 }
00392
00393 using ::sin;
00394
00395 inline float
00396 sin(float __x)
00397 { return __builtin_sinf(__x); }
00398
00399 inline long double
00400 sin(long double __x)
00401 { return __builtin_sinl(__x); }
00402
00403 template<typename _Tp>
00404 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00405 double>::__type
00406 sin(_Tp __x)
00407 { return __builtin_sin(__x); }
00408
00409 using ::sinh;
00410
00411 inline float
00412 sinh(float __x)
00413 { return __builtin_sinhf(__x); }
00414
00415 inline long double
00416 sinh(long double __x)
00417 { return __builtin_sinhl(__x); }
00418
00419 template<typename _Tp>
00420 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00421 double>::__type
00422 sinh(_Tp __x)
00423 { return __builtin_sinh(__x); }
00424
00425 using ::sqrt;
00426
00427 inline float
00428 sqrt(float __x)
00429 { return __builtin_sqrtf(__x); }
00430
00431 inline long double
00432 sqrt(long double __x)
00433 { return __builtin_sqrtl(__x); }
00434
00435 template<typename _Tp>
00436 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00437 double>::__type
00438 sqrt(_Tp __x)
00439 { return __builtin_sqrt(__x); }
00440
00441 using ::tan;
00442
00443 inline float
00444 tan(float __x)
00445 { return __builtin_tanf(__x); }
00446
00447 inline long double
00448 tan(long double __x)
00449 { return __builtin_tanl(__x); }
00450
00451 template<typename _Tp>
00452 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00453 double>::__type
00454 tan(_Tp __x)
00455 { return __builtin_tan(__x); }
00456
00457 using ::tanh;
00458
00459 inline float
00460 tanh(float __x)
00461 { return __builtin_tanhf(__x); }
00462
00463 inline long double
00464 tanh(long double __x)
00465 { return __builtin_tanhl(__x); }
00466
00467 template<typename _Tp>
00468 inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
00469 double>::__type
00470 tanh(_Tp __x)
00471 { return __builtin_tanh(__x); }
00472
00473 _GLIBCXX_END_NAMESPACE
00474
00475 #if _GLIBCXX_USE_C99_MATH
00476 #if !_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
00477
00478
00479 #undef fpclassify
00480 #undef isfinite
00481 #undef isinf
00482 #undef isnan
00483 #undef isnormal
00484 #undef signbit
00485 #undef isgreater
00486 #undef isgreaterequal
00487 #undef isless
00488 #undef islessequal
00489 #undef islessgreater
00490 #undef isunordered
00491
00492 _GLIBCXX_BEGIN_NAMESPACE(std)
00493
00494 template<typename _Tp>
00495 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00496 int>::__type
00497 fpclassify(_Tp __f)
00498 {
00499 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00500 return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL,
00501 FP_SUBNORMAL, FP_ZERO, __type(__f));
00502 }
00503
00504 template<typename _Tp>
00505 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00506 int>::__type
00507 isfinite(_Tp __f)
00508 {
00509 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00510 return __builtin_isfinite(__type(__f));
00511 }
00512
00513 template<typename _Tp>
00514 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00515 int>::__type
00516 isinf(_Tp __f)
00517 {
00518 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00519 return __builtin_isinf(__type(__f));
00520 }
00521
00522 template<typename _Tp>
00523 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00524 int>::__type
00525 isnan(_Tp __f)
00526 {
00527 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00528 return __builtin_isnan(__type(__f));
00529 }
00530
00531 template<typename _Tp>
00532 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00533 int>::__type
00534 isnormal(_Tp __f)
00535 {
00536 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00537 return __builtin_isnormal(__type(__f));
00538 }
00539
00540 template<typename _Tp>
00541 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00542 int>::__type
00543 signbit(_Tp __f)
00544 {
00545 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00546 return __builtin_signbit(__type(__f));
00547 }
00548
00549 template<typename _Tp>
00550 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00551 int>::__type
00552 isgreater(_Tp __f1, _Tp __f2)
00553 {
00554 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00555 return __builtin_isgreater(__type(__f1), __type(__f2));
00556 }
00557
00558 template<typename _Tp>
00559 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00560 int>::__type
00561 isgreaterequal(_Tp __f1, _Tp __f2)
00562 {
00563 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00564 return __builtin_isgreaterequal(__type(__f1), __type(__f2));
00565 }
00566
00567 template<typename _Tp>
00568 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00569 int>::__type
00570 isless(_Tp __f1, _Tp __f2)
00571 {
00572 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00573 return __builtin_isless(__type(__f1), __type(__f2));
00574 }
00575
00576 template<typename _Tp>
00577 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00578 int>::__type
00579 islessequal(_Tp __f1, _Tp __f2)
00580 {
00581 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00582 return __builtin_islessequal(__type(__f1), __type(__f2));
00583 }
00584
00585 template<typename _Tp>
00586 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00587 int>::__type
00588 islessgreater(_Tp __f1, _Tp __f2)
00589 {
00590 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00591 return __builtin_islessgreater(__type(__f1), __type(__f2));
00592 }
00593
00594 template<typename _Tp>
00595 inline typename __gnu_cxx::__enable_if<__is_arithmetic<_Tp>::__value,
00596 int>::__type
00597 isunordered(_Tp __f1, _Tp __f2)
00598 {
00599 typedef typename __gnu_cxx::__promote<_Tp>::__type __type;
00600 return __builtin_isunordered(__type(__f1), __type(__f2));
00601 }
00602
00603 _GLIBCXX_END_NAMESPACE
00604
00605 #endif
00606 #endif
00607
00608 #ifndef _GLIBCXX_EXPORT_TEMPLATE
00609 # include <bits/cmath.tcc>
00610 #endif
00611
00612 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00613 # if defined(_GLIBCXX_INCLUDE_AS_TR1)
00614 # error C++0x header cannot be included from TR1 header
00615 # endif
00616 # if defined(_GLIBCXX_INCLUDE_AS_CXX0X)
00617 # include <tr1_impl/cmath>
00618 # else
00619 # define _GLIBCXX_INCLUDE_AS_CXX0X
00620 # define _GLIBCXX_BEGIN_NAMESPACE_TR1
00621 # define _GLIBCXX_END_NAMESPACE_TR1
00622 # define _GLIBCXX_TR1
00623 # include <tr1_impl/cmath>
00624 # undef _GLIBCXX_TR1
00625 # undef _GLIBCXX_END_NAMESPACE_TR1
00626 # undef _GLIBCXX_BEGIN_NAMESPACE_TR1
00627 # undef _GLIBCXX_INCLUDE_AS_CXX0X
00628 # endif
00629 #endif
00630
00631 #endif