home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / cwin / c.exe / $INSTDIR / include / c++ / cmath < prev    next >
Encoding:
Text File  |  2003-12-15  |  14.9 KB  |  658 lines

  1. // -*- C++ -*- C forwarding header.
  2.  
  3. // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
  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 _CPP_CMATH
  45. #define _CPP_CMATH 1
  46.  
  47. #pragma GCC system_header
  48.  
  49. #include <bits/c++config.h>
  50.  
  51. #include <math.h>
  52.  
  53. // Get rid of those macros defined in <math.h> in lieu of real functions.
  54. #undef abs
  55. #undef div
  56. #undef acos
  57. #undef asin
  58. #undef atan
  59. #undef atan2
  60. #undef ceil
  61. #undef cos
  62. #undef cosh
  63. #undef exp
  64. #undef fabs
  65. #undef floor
  66. #undef fmod
  67. #undef frexp
  68. #undef ldexp
  69. #undef log
  70. #undef log10
  71. #undef modf
  72. #undef pow
  73. #undef sin
  74. #undef sinh
  75. #undef sqrt
  76. #undef tan
  77. #undef tanh
  78.  
  79. namespace std 
  80. {
  81.   // Forward declaration of a helper function.  This really should be
  82.   // an `exported' forward declaration.
  83.   template<typename _Tp> _Tp __cmath_power(_Tp, unsigned int);
  84.  
  85.   inline double
  86.   abs(double __x)
  87.   { return __builtin_fabs(__x); }
  88.  
  89.   inline float
  90.   abs(float __x)
  91.   { return __builtin_fabsf(__x); }
  92.  
  93.   inline long double
  94.   abs(long double __x)
  95.   { return __builtin_fabsl(__x); }
  96.  
  97. #if _GLIBCPP_HAVE_ACOSF
  98.   inline float 
  99.   acos(float __x) { return ::acosf(__x); }
  100. #else
  101.   inline float 
  102.   acos(float __x) { return ::acos(static_cast<double>(__x)); }
  103. #endif
  104.  
  105.   using ::acos;
  106.   
  107. #if _GLIBCPP_HAVE_ACOSL
  108.   inline long double 
  109.   acos(long double __x) { return ::acosl(__x); }
  110. #else
  111.   inline long double 
  112.   acos(long double __x) { return ::acos(static_cast<double>(__x)); }
  113. #endif
  114.  
  115.   using ::asin;
  116.  
  117. #if _GLIBCPP_HAVE_ASINF
  118.   inline float 
  119.   asin(float __x) { return ::asinf(__x); }
  120. #else
  121.   inline float 
  122.   asin(float __x) { return ::asin(static_cast<double>(__x)); }
  123. #endif
  124.  
  125. #if _GLIBCPP_HAVE_ASINL
  126.   inline long double 
  127.   asin(long double __x) { return ::asinl(__x); }
  128. #else
  129.   inline long double 
  130.   asin(long double __x) { return ::asin(static_cast<double>(__x)); }
  131. #endif
  132.  
  133.   using ::atan;
  134.  
  135. #if _GLIBCPP_HAVE_ATANF
  136.   inline float 
  137.   atan(float __x) { return ::atanf(__x); }
  138. #else
  139.   inline float 
  140.   atan(float __x) { return ::atan(static_cast<double>(__x)); }
  141. #endif
  142.  
  143. #if _GLIBCPP_HAVE_ATANL
  144.   inline long double 
  145.   atan(long double __x) { return ::atanl(__x); }
  146. #else
  147.   inline long double 
  148.   atan(long double __x) { return ::atan(static_cast<double>(__x)); }
  149. #endif
  150.  
  151.   using ::atan2;
  152.  
  153. #if _GLIBCPP_HAVE_ATAN2F
  154.   inline float 
  155.   atan2(float __y, float __x) { return ::atan2f(__y, __x); }
  156. #else
  157.   inline float 
  158.   atan2(float __y, float __x)
  159.   { return ::atan2(static_cast<double>(__y), static_cast<double>(__x)); }
  160. #endif
  161.  
  162. #if _GLIBCPP_HAVE_ATAN2L
  163.   inline long double 
  164.   atan2(long double __y, long double __x) { return ::atan2l(__y, __x); }
  165. #else
  166.   inline long double 
  167.   atan2(long double __y, long double __x) 
  168.   { return ::atan2(static_cast<double>(__y), static_cast<double>(__x)); }
  169. #endif
  170.  
  171.   using ::ceil;
  172.  
  173. #if _GLIBCPP_HAVE_CEILF
  174.   inline float 
  175.   ceil(float __x) { return ::ceilf(__x); }
  176. #else
  177.   inline float 
  178.   ceil(float __x) { return ::ceil(static_cast<double>(__x)); }
  179. #endif
  180.  
  181. #if _GLIBCPP_HAVE_CEILL
  182.   inline long double 
  183.   ceil(long double __x) { return ::ceill(__x); }
  184. #else
  185.   inline long double 
  186.   ceil(long double __x) { return ::ceil(static_cast<double>(__x)); }
  187. #endif
  188.  
  189.   using ::cos;
  190.  
  191.   inline float
  192.   cos(float __x)
  193.   { return __builtin_cosf(__x); }
  194.  
  195.   inline long double
  196.   cos(long double __x)
  197.   { return __builtin_cosl(__x); }
  198.  
  199.   using ::cosh;
  200.  
  201. #if _GLIBCPP_HAVE_COSHF
  202.   inline float 
  203.   cosh(float __x) { return ::coshf(__x); }
  204. #else
  205.   inline float 
  206.   cosh(float __x) { return ::cosh(static_cast<double>(__x)); }
  207. #endif
  208.  
  209. #if _GLIBCPP_HAVE_COSHL
  210.   inline long double 
  211.   cosh(long double __x) { return ::coshl(__x); }
  212. #else
  213.   inline long double 
  214.   cosh(long double __x) { return ::cosh(static_cast<double>(__x)); }
  215. #endif
  216.  
  217.   using ::exp;
  218.  
  219. #if _GLIBCPP_HAVE_EXPF
  220.   inline float 
  221.   exp(float __x) { return ::expf(__x); }
  222. #else
  223.   inline float 
  224.   exp(float __x) { return ::exp(static_cast<double>(__x)); }
  225. #endif
  226.  
  227. #if _GLIBCPP_HAVE_EXPL
  228.   inline long double 
  229.   exp(long double __x) { return ::expl(__x); }
  230. #else
  231.   inline long double 
  232.   exp(long double __x) { return ::exp(static_cast<double>(__x)); }
  233. #endif
  234.  
  235.   using ::fabs;
  236.  
  237.   inline float
  238.   fabs(float __x)
  239.   { return __builtin_fabsf(__x); }
  240.  
  241.   inline long double
  242.   fabs(long double __x)
  243.   { return __builtin_fabsl(__x); }
  244.  
  245.   using ::floor;
  246.  
  247. #if _GLIBCPP_HAVE_FLOORF
  248.   inline float 
  249.   floor(float __x) { return ::floorf(__x); }
  250. #else
  251.   inline float 
  252.   floor(float __x) { return ::floor(static_cast<double>(__x)); }
  253. #endif
  254.  
  255. #if _GLIBCPP_HAVE_FLOORL
  256.   inline long double 
  257.   floor(long double __x) { return ::floorl(__x); }
  258. #else
  259.   inline long double 
  260.   floor(long double __x) { return ::floor(static_cast<double>(__x)); }
  261. #endif
  262.  
  263.   using ::fmod;
  264.  
  265. #if _GLIBCPP_HAVE_FMODF
  266.   inline float 
  267.   fmod(float __x, float __y) { return ::fmodf(__x, __y); }
  268. #else
  269.   inline float 
  270.   fmod(float __x, float __y)
  271.   { return ::fmod(static_cast<double>(__x), static_cast<double>(__y)); }
  272. #endif
  273.  
  274. #if _GLIBCPP_HAVE_FMODL
  275.   inline long double 
  276.   fmod(long double __x, long double __y) { return ::fmodl(__x, __y); }
  277. #else
  278.   inline long double 
  279.   fmod(long double __x, long double __y) 
  280.   { return ::fmod(static_cast<double>(__x), static_cast<double>(__y)); }
  281. #endif
  282.  
  283.   using ::frexp;
  284.  
  285. #if _GLIBCPP_HAVE_FREXPF
  286.   inline float 
  287.   frexp(float __x, int* __exp) { return ::frexpf(__x, __exp); }
  288. #else
  289.   inline float 
  290.   frexp(float __x, int* __exp) { return ::frexp(__x, __exp); }
  291. #endif
  292.  
  293. #if _GLIBCPP_HAVE_FREXPL
  294.   inline long double 
  295.   frexp(long double __x, int* __exp) { return ::frexpl(__x, __exp); }
  296. #else
  297.   inline long double 
  298.   frexp(long double __x, int* __exp) 
  299.   { return ::frexp(static_cast<double>(__x), __exp); }
  300. #endif
  301.  
  302.   using ::ldexp;
  303.  
  304. #if _GLIBCPP_HAVE_LDEXPF
  305.   inline float 
  306.   ldexp(float __x, int __exp) { return ::ldexpf(__x, __exp); }
  307. #else
  308.   inline float 
  309.   ldexp(float __x, int __exp)
  310.   { return ::ldexp(static_cast<double>(__x), __exp); }
  311. #endif
  312.  
  313. #if _GLIBCPP_HAVE_LDEXPL
  314.   inline long double 
  315.   ldexp(long double __x, int __exp) { return ::ldexpl(__x, __exp); }
  316. #else
  317.   inline long double 
  318.   ldexp(long double __x, int __exp) 
  319.   { return ::ldexp(static_cast<double>(__x), __exp); }
  320. #endif
  321.  
  322.   using ::log;
  323.  
  324. #if _GLIBCPP_HAVE_LOGF
  325.   inline float 
  326.   log(float __x) { return ::logf(__x); }
  327. #else
  328.   inline float log(float __x)
  329.   { return ::log(static_cast<double>(__x)); }
  330. #endif
  331.  
  332. #if _GLIBCPP_HAVE_LOGL
  333.   inline long double 
  334.   log(long double __x) { return ::logl(__x); }
  335. #else
  336.   inline long double 
  337.   log(long double __x) { return ::log(static_cast<double>(__x)); }
  338. #endif
  339.  
  340.   using ::log10;
  341.  
  342. #if _GLIBCPP_HAVE_LOG10F
  343.   inline float 
  344.   log10(float __x) { return ::log10f(__x); }
  345. #else
  346.   inline float 
  347.   log10(float __x) { return ::log10(static_cast<double>(__x)); }
  348. #endif
  349.  
  350. #if _GLIBCPP_HAVE_LOG10L
  351.   inline long double 
  352.   log10(long double __x) { return ::log10l(__x); }
  353. #else
  354.   inline long double 
  355.   log10(long double __x) { return ::log10(static_cast<double>(__x)); }
  356. #endif
  357.  
  358.   using ::modf;
  359.  
  360. #if _GLIBCPP_HAVE_MODFF
  361.   inline float 
  362.   modf(float __x, float* __iptr) { return ::modff(__x, __iptr); }
  363. #else
  364.   inline float 
  365.   modf(float __x, float* __iptr)
  366.   {
  367.     double __tmp;
  368.     double __res = ::modf(static_cast<double>(__x), &__tmp);
  369.     *__iptr = static_cast<float>(__tmp);
  370.     return __res;
  371.   }
  372. #endif
  373.  
  374. #if _GLIBCPP_HAVE_MODFL
  375.   inline long double 
  376.   modf(long double __x, long double* __iptr) { return ::modfl(__x, __iptr); }
  377. #else
  378.   inline long double 
  379.   modf(long double __x, long double* __iptr) 
  380.   { 
  381.     double __tmp;
  382.     double __res = ::modf(static_cast<double>(__x), &__tmp);
  383.     * __iptr = static_cast<long double>(__tmp);
  384.     return __res;
  385.   }
  386. #endif
  387.  
  388.   template<typename _Tp>
  389.     inline _Tp
  390.     __pow_helper(_Tp __x, int __n)
  391.     {
  392.       return __n < 0
  393.         ? _Tp(1)/__cmath_power(__x, -__n)
  394.         : __cmath_power(__x, __n);
  395.     }
  396.  
  397.   using ::pow;
  398.  
  399. #if _GLIBCPP_HAVE_POWF
  400.   inline float 
  401.   pow(float __x, float __y) { return ::powf(__x, __y); }
  402. #else
  403.   inline float 
  404.   pow(float __x, float __y)
  405.   { return ::pow(static_cast<double>(__x), static_cast<double>(__y)); }
  406. #endif
  407.  
  408. #if _GLIBCPP_HAVE_POWL
  409.   inline long double 
  410.   pow(long double __x, long double __y) { return ::powl(__x, __y); }
  411. #else
  412.   inline long double 
  413.   pow(long double __x, long double __y) 
  414.   { return ::pow(static_cast<double>(__x), static_cast<double>(__y)); }
  415. #endif
  416.  
  417.   inline double 
  418.   pow(double __x, int __i)
  419.   { return __pow_helper(__x, __i); }
  420.  
  421.   inline float 
  422.   pow(float __x, int __n)
  423.   { return __pow_helper(__x, __n); }
  424.  
  425.   inline long double 
  426.   pow(long double __x, int __n)
  427.   { return __pow_helper(__x, __n); }
  428.  
  429.   using ::sin;
  430.  
  431.   inline float
  432.   sin(float __x)
  433.   { return __builtin_sinf(__x); }
  434.  
  435.   inline long double
  436.   sin(long double __x)
  437.   { return __builtin_sinl(__x); }
  438.  
  439.   using ::sinh;
  440.  
  441. #if _GLIBCPP_HAVE_SINHF
  442.   inline float 
  443.   sinh(float __x) { return ::sinhf(__x); }
  444. #else
  445.   inline float 
  446.   sinh(float __x) { return ::sinh(static_cast<double>(__x)); }
  447. #endif
  448.  
  449. #if _GLIBCPP_HAVE_SINHL
  450.   inline long double 
  451.   sinh(long double __x) { return ::sinhl(__x); }
  452. #else
  453.   inline long double 
  454.   sinh(long double __x) { return ::sinh(static_cast<double>(__x)); }
  455. #endif
  456.  
  457.   using ::sqrt;
  458.  
  459.   inline float
  460.   sqrt(float __x)
  461.   { return __builtin_sqrtf(__x); }
  462.  
  463.   inline long double
  464.   sqrt(long double __x)
  465.   { return __builtin_sqrtl(__x); }
  466.  
  467.   using ::tan;
  468.  
  469. #if _GLIBCPP_HAVE_TANF
  470.   inline float 
  471.   tan(float __x) { return ::tanf(__x); }
  472. #else
  473.   inline float 
  474.   tan(float __x) { return ::tan(static_cast<double>(__x)); }
  475. #endif
  476.  
  477. #if _GLIBCPP_HAVE_TANL
  478.   inline long double 
  479.   tan(long double __x) { return ::tanl(__x); }
  480. #else
  481.   inline long double 
  482.   tan(long double __x) { return ::tan(static_cast<double>(__x)); }
  483. #endif
  484.  
  485.   using ::tanh;
  486.  
  487. #if _GLIBCPP_HAVE_TANHF
  488.   inline float 
  489.   tanh(float __x) { return ::tanhf(__x); }
  490. #else
  491.   inline float 
  492.   tanh(float __x) { return ::tanh(static_cast<double>(__x)); }
  493. #endif
  494.  
  495. #if _GLIBCPP_HAVE_TANHL
  496.   inline long double 
  497.   tanh(long double __x) { return ::tanhl(__x); }
  498. #else
  499.   inline long double 
  500.   tanh(long double __x) { return ::tanh(static_cast<double>(__x)); }
  501. #endif
  502.  
  503.  
  504. #if _GLIBCPP_USE_C99
  505. // These are possible macros imported from C99-land. For strict
  506. // conformance, remove possible C99-injected names from the global
  507. // namespace, and sequester them in the __gnu_cxx extension namespace. 
  508. namespace __gnu_cxx
  509. {
  510.   template<typename _Tp>
  511.     int 
  512.     __capture_fpclassify(_Tp __f) { return fpclassify(__f); }
  513.  
  514.   template<typename _Tp>
  515.     int 
  516.     __capture_isfinite(_Tp __f) { return isfinite(__f); }
  517.  
  518.   template<typename _Tp>
  519.     int 
  520.     __capture_isinf(_Tp __f) { return isinf(__f); }
  521.  
  522.   template<typename _Tp>
  523.     int 
  524.     __capture_isnan(_Tp __f) { return isnan(__f); }
  525.  
  526.   template<typename _Tp>
  527.     int 
  528.     __capture_isnormal(_Tp __f) { return isnormal(__f); }
  529.  
  530.   template<typename _Tp>
  531.     int 
  532.     __capture_signbit(_Tp __f) { return signbit(__f); }
  533.  
  534.   template<typename _Tp>
  535.     int 
  536.     __capture_isgreater(_Tp __f1, _Tp __f2)
  537.     { return isgreater(__f1, __f2); }
  538.  
  539.   template<typename _Tp>
  540.      int 
  541.      __capture_isgreaterequal(_Tp __f1, _Tp __f2) 
  542.      { return isgreaterequal(__f1, __f2); }
  543.  
  544.   template<typename _Tp>
  545.      int 
  546.      __capture_isless(_Tp __f1, _Tp __f2) { return isless(__f1, __f2); }
  547.  
  548.   template<typename _Tp>
  549.      int 
  550.      __capture_islessequal(_Tp __f1, _Tp __f2) 
  551.      { return islessequal(__f1, __f2); }
  552.  
  553.   template<typename _Tp>
  554.      int 
  555.      __capture_islessgreater(_Tp __f1, _Tp __f2) 
  556.      { return islessgreater(__f1, __f2); }
  557.  
  558.   template<typename _Tp>
  559.      int 
  560.      __capture_isunordered(_Tp __f1, _Tp __f2) 
  561.      { return isunordered(__f1, __f2); }
  562. #endif
  563.  
  564. #undef fpclassify
  565. #undef isfinite
  566. #undef isinf
  567. #undef isnan
  568. #undef isnormal
  569. #undef signbit
  570. #undef isgreater
  571. #undef isgreaterequal
  572. #undef isless
  573. #undef islessequal
  574. #undef islessgreater
  575. #undef isunordered
  576.  
  577. #if _GLIBCPP_USE_C99
  578. namespace __gnu_cxx
  579. {
  580.   template<typename _Tp>
  581.     int
  582.     fpclassify(_Tp __f) { return __capture_fpclassify(__f); }
  583.  
  584.   template<typename _Tp>
  585.     int
  586.     isfinite(_Tp __f) { return __capture_isfinite(__f); }
  587.  
  588.   template<typename _Tp>
  589.     int 
  590.     isinf(_Tp __f) { return __capture_isinf(__f); }
  591.  
  592.   template<typename _Tp>
  593.     int 
  594.     isnan(_Tp __f) { return __capture_isnan(__f); }
  595.  
  596.   template<typename _Tp>
  597.     int 
  598.     isnormal(_Tp __f) { return __capture_isnormal(__f); }
  599.  
  600.   template<typename _Tp>
  601.     int 
  602.     signbit(_Tp __f) { return __capture_signbit(__f); }
  603.  
  604.   template<typename _Tp>
  605.     int 
  606.     isgreater(_Tp __f1, _Tp __f2) { return __capture_isgreater(__f1, __f2); }
  607.  
  608.   template<typename _Tp>
  609.     int 
  610.     isgreaterequal(_Tp __f1, _Tp __f2) 
  611.     { return __capture_isgreaterequal(__f1, __f2); }
  612.  
  613.   template<typename _Tp>
  614.     int 
  615.     isless(_Tp __f1, _Tp __f2) { return __capture_isless(__f1, __f2); }
  616.  
  617.   template<typename _Tp>
  618.     int 
  619.     islessequal(_Tp __f1, _Tp __f2) 
  620.     { return __capture_islessequal(__f1, __f2); }
  621.  
  622.   template<typename _Tp>
  623.     int 
  624.     islessgreater(_Tp __f1, _Tp __f2) 
  625.     { return __capture_islessgreater(__f1, __f2); }
  626.  
  627.   template<typename _Tp>
  628.     int 
  629.     isunordered(_Tp __f1, _Tp __f2) 
  630.     { return __capture_isunordered(__f1, __f2); }
  631. }
  632.  
  633. namespace std
  634. {
  635.   using __gnu_cxx::fpclassify;
  636.   using __gnu_cxx::isfinite;
  637.   using __gnu_cxx::isinf;
  638.   using __gnu_cxx::isnan;
  639.   using __gnu_cxx::isnormal;
  640.   using __gnu_cxx::signbit;
  641.   using __gnu_cxx::isgreater;
  642.   using __gnu_cxx::isgreaterequal;
  643.   using __gnu_cxx::isless;
  644.   using __gnu_cxx::islessequal;
  645.   using __gnu_cxx::islessgreater;
  646.   using __gnu_cxx::isunordered;
  647. }
  648. #endif
  649.   
  650. #ifdef _GLIBCPP_NO_TEMPLATE_EXPORT
  651. #  define export
  652. #  include <bits/cmath.tcc>
  653. #endif
  654.  
  655. #endif
  656.