[section:c99 C99 C Functions]

[h4 Supported C99 Functions]

   namespace boost{ namespace math{ namespace tr1{ extern "C"{

   typedef unspecified float_t;
   typedef unspecified double_t;

   double acosh(double x);
   float acoshf(float x);
   long double acoshl(long double x);

   double asinh(double x);
   float asinhf(float x);
   long double asinhl(long double x);

   double atanh(double x);
   float atanhf(float x);
   long double atanhl(long double x);

   double cbrt(double x);
   float cbrtf(float x);
   long double cbrtl(long double x);

   double copysign(double x, double y);
   float copysignf(float x, float y);
   long double copysignl(long double x, long double y);

   double erf(double x);
   float erff(float x);
   long double erfl(long double x);

   double erfc(double x);
   float erfcf(float x);
   long double erfcl(long double x);

   double expm1(double x);
   float expm1f(float x);
   long double expm1l(long double x);

   double fmax(double x, double y);
   float fmaxf(float x, float y);
   long double fmaxl(long double x, long double y);

   double fmin(double x, double y);
   float fminf(float x, float y);
   long double fminl(long double x, long double y);

   double hypot(double x, double y);
   float hypotf(float x, float y);
   long double hypotl(long double x, long double y);

   double lgamma(double x);
   float lgammaf(float x);
   long double lgammal(long double x);

   long long llround(double x);
   long long llroundf(float x);
   long long llroundl(long double x);

   double log1p(double x);
   float log1pf(float x);
   long double log1pl(long double x);

   long lround(double x);
   long lroundf(float x);
   long lroundl(long double x);

   double nextafter(double x, double y);
   float nextafterf(float x, float y);
   long double nextafterl(long double x, long double y);

   double nexttoward(double x, long double y);
   float nexttowardf(float x, long double y);
   long double nexttowardl(long double x, long double y);

   double round(double x);
   float roundf(float x);
   long double roundl(long double x);

   double tgamma(double x);
   float tgammaf(float x);
   long double tgammal(long double x);

   double trunc(double x);
   float truncf(float x);
   long double truncl(long double x);

   }}}} // namespaces
   
In addition sufficient additional overloads of the `double` versions of the
above functions are provided, so that calling the function with any mixture
of `float`, `double`, `long double`, or /integer/ arguments is supported, with the
return type determined by the __arg_pomotion_rules.

For example:

   acoshf(2.0f);  // float version, returns float.
   acosh(2.0f);   // also calls the float version and returns float.
   acosh(2.0);    // double version, returns double.
   acoshl(2.0L);  // long double version, returns a long double.
   acosh(2.0L);   // also calls the long double version.
   acosh(2);      // integer argument is treated as a double, returns double.

[h4 Quick Reference]

More detailed descriptions of these functions are available in the
C99 standard.

   typedef unspecified float_t;
   typedef unspecified double_t;
   
In this implementation `float_t` is the same as type `float`, and
`double_t` the same as type `double` unless the preprocessor symbol
FLT_EVAL_METHOD is defined, in which case these are set as follows:

[table
[[FLT_EVAL_METHOD][float_t][double_t]]
[[0][float][double]]
[[1][double][double]]
[[2][long double][long double]]
]

   double acosh(double x);
   float acoshf(float x);
   long double acoshl(long double x);

Returns the inverse hyperbolic cosine of /x/.

See also __acosh for the full template (header only) version of this function.

   double asinh(double x);
   float asinhf(float x);
   long double asinhl(long double x);

Returns the inverse hyperbolic sine of /x/.

See also __asinh for the full template (header only) version of this function.

   double atanh(double x);
   float atanhf(float x);
   long double atanhl(long double x);

Returns the inverse hyperbolic tangent of /x/.

See also __atanh for the full template (header only) version of this function.

   double cbrt(double x);
   float cbrtf(float x);
   long double cbrtl(long double x);
   
Returns the cubed root of /x/.

See also __cbrt for the full template (header only) version of this function.

   double copysign(double x, double y);
   float copysignf(float x, float y);
   long double copysignl(long double x, long double y);

Returns a value with the magnitude of /x/ and the sign of /y/.

   double erf(double x);
   float erff(float x);
   long double erfl(long double x);

Returns the error function of /x/:

[equation erf1]

See also __erf for the full template (header only) version of this function.

   double erfc(double x);
   float erfcf(float x);
   long double erfcl(long double x);

Returns the complementary error function of /x/ `1-erf(x)` without the loss
of precision implied by the subtraction.

See also __erfc for the full template (header only) version of this function.

   double expm1(double x);
   float expm1f(float x);
   long double expm1l(long double x);

Returns `exp(x)-1` without the loss
of precision implied by the subtraction.

See also __expm1 for the full template (header only) version of this function.

   double fmax(double x, double y);
   float fmaxf(float x, float y);
   long double fmaxl(long double x, long double y);

Returns the larger (most positive) of /x/ and /y/.

   double fmin(double x, double y);
   float fminf(float x, float y);
   long double fminl(long double x, long double y);

Returns the smaller (most negative) of /x/ and /y/.

   double hypot(double x, double y);
   float hypotf(float x, float y);
   long double hypotl(long double x, long double y);

Returns `sqrt(x*x + y*y)` without the danger of numeric overflow
implied by that formulation.

See also __hypot for the full template (header only) version of this function.

   double lgamma(double x);
   float lgammaf(float x);
   long double lgammal(long double x);
   
Returns the log of the gamma function of /x/.

[equation lgamm1]

See also __lgamma for the full template (header only) version of this function.

   long long llround(double x);
   long long llroundf(float x);
   long long llroundl(long double x);
   
Returns the value /x/ rounded to the nearest integer as a `long long`: 
equivalent to `floor(x + 0.5)`

See also __llround for the full template (header only) version of this function.

   double log1p(double x);
   float log1pf(float x);
   long double log1pl(long double x);
   
Returns the `log(x+1)` without the loss of precision 
implied by that formulation.

See also __log1p for the full template (header only) version of this function.

   long lround(double x);
   long lroundf(float x);
   long lroundl(long double x);

Returns the value /x/ rounded to the nearest integer as a `long`: 
equivalent to `floor(x + 0.5)`

See also __lround for the full template (header only) version of this function.

   double nextafter(double x, double y);
   float nextafterf(float x, float y);
   long double nextafterl(long double x, long double y);
   
Returns the next representable floating point number after /x/
in the direction of /y/, or /x/ if `x == y`.

   double nexttoward(double x, long double y);
   float nexttowardf(float x, long double y);
   long double nexttowardl(long double x, long double y);
   
As `nextafter`, but with /y/ always expressed as a `long double`.

   double round(double x);
   float roundf(float x);
   long double roundl(long double x);

Returns the value /x/ rounded to the nearest integer: 
equivalent to `floor(x + 0.5)`

See also __round for the full template (header only) version of this function.

   double tgamma(double x);
   float tgammaf(float x);
   long double tgammal(long double x);
   
Returns the gamma function of /x/:

[equation gamm1]

See also __tgamma for the full template (header only) version of this function.

   double trunc(double x);
   float truncf(float x);
   long double truncl(long double x);
   
Returns /x/ truncated to the nearest integer.

See also __trunc for the full template (header only) version of this function.

[endsect]

[/ 
  Copyright 2008 John Maddock and Paul A. Bristow.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

