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