+// ----------------------------------------------------------------------------
+// $Id$
+// ----------------------------------------------------------------------------
+// Public Domain C Library - http://pdclib.sourceforge.net
+// This code is Public Domain. Use, modify, and redistribute at will.
+// ----------------------------------------------------------------------------
+// Provides floating point math functions.
+// ----------------------------------------------------------------------------
+
+#ifndef __MATH_H
+#define __MATH_H __MATH_H
+
+// ----------------------------------------------------------------------------
+// DEFINES
+
+#define HUGE_VAL // TODO
+#define HUGE_VALF // TODO
+#define HUGE_VALL // TODO
+
+#define INFINITY // TODO
+#define NAN // TODO
+
+#define FP_FAST_FMA // TODO
+#define FP_FAST_FMAF // TODO
+#define FP_FAST_FMAL // TODO
+
+#define FP_INFINITE // TODO
+#define FP_NAN // TODO
+#define FP_NORMAL // TODO
+#define FP_SUBNORMAL // TODO
+#define FP_ZERO // TODO
+
+#define FP_ILOGB0 // TODO
+#define FP_ILOGBNAN // TODO
+
+#define MATH_ERRNO 1
+#define MATH_ERREXCEPT 2
+#define math_errhandling // TODO
+
+// --------------------------------------------------------------------------
+// TYPEDEFS
+
+typedef f-type double_t; // TODO
+typedef f-type float_t; // TODO
+
+// --------------------------------------------------------------------------
+// MACROS
+
+#ifndef __cplusplus
+
+#define signbit(x) // TODO
+#define fpclassify(x) // TODO
+#define isfinite(x) // TODO
+#define isinf(x) // TODO
+#define isnan(x) // TODO
+#define isnormal(x) // TODO
+
+#define isgreater(x, y) // TODO
+#define isgreaterequal(x, y) // TODO
+#define isless(x, y) // TODO
+#define islessequal(x, y) // TODO
+#define islessgreater(x, y) // TODO
+#define isunordered(x, y) // TODO
+
+#else // __cplusplus
+
+// The same functionality as above is implemented as functions in C++.
+bool signbit( float x );
+bool signbit( double x );
+bool signbit( long double x );
+int fpclassify( float x );
+int fpclassify( double x );
+int fpclassify( long double x );
+bool isfinite( float x );
+bool isfinite( double x );
+bool isfinite( long double x );
+bool isinf( float x );
+bool isinf( double x );
+bool isinf( long double x );
+bool isnan( float x );
+bool isnan( double x );
+bool isnan( long double x );
+bool isnormal( float x );
+bool isnormal( double x );
+bool isnormal( long double x );
+bool isgreater( float x, float y );
+bool isgreater( double x, double y );
+bool isgreater( long double x, long double y );
+bool isgreaterequal( float x, float y );
+bool isgreaterequal( double x, double y );
+bool isgreaterequal( long double x, long double y );
+bool isless( float x, float y );
+bool isless( double x, double y );
+bool isless( long double x, long double y );
+bool islessequal( float x, float y );
+bool islessequal( double x, double y );
+bool islessequal( long double x, long double y );
+bool islessgreater( float x, float y );
+bool islessgreater( double x, double y );
+bool islessgreater( long double x, long double y );
+bool isunordered( float x, float y );
+bool isunordered( double x, double y );
+bool isunordered( long double x, long double y );
+
+#endif // __cplusplus
+
+// --------------------------------------------------------------------------
+// FUNCTIONS - C++
+
+// These functions return the magnitude of their parameter.
+double abs(double x);
+float abs(float x);
+long double abs(long double x);
+float fabs(float x);
+long double fabs(long double x);
+
+// These functions return the sine of their parameter.
+float sin(float x);
+long double sin(long double x);
+
+// These functions return the hyperbolic sine of their parameter.
+float sinh(float x);
+long double sinh(long double x);
+
+// These functions return the arcsine of their parameter.
+float asin(float x);
+long double asin(long double x);
+
+// These functions return the hyperbolic arcsine of their parameter.
+float asinh(float x);
+long double asinh(long double x);
+
+// These functions return the cosine of their parameter.
+float cos(float x);
+long double cos(long double x);
+
+// These functions return the hyperbolic cosine of their parameter.
+float cosh(float x);
+long double cosh(long double x);
+
+// These functions return the arccosine of their parameter.
+float acos(float x);
+long double acos(long double x);
+
+// These functions return the hyperbolic arccosine of their parameter.
+float acosh(float x);
+long double acosh(long double x);
+
+// These functions return the tangent of their parameter.
+float tan(float x);
+long double tan(long double x);
+
+// These functions return the hyperbolic tangent of their parameter.
+float tanh(float x);
+long double tanh(long double x);
+
+// These functions return the arctangent of their parameter.
+float atan(float x);
+long double atan(long double x);
+
+// These functions return the hyperbolic arctangent of their parameter.
+float atanh(float x);
+long double atanh(long double x);
+
+// TODO
+float atan2(float y, float x);
+long double atan2(long double y, long double x);
+
+// These functions return sqrt(x^2 + y^2).
+float hypot(float x, float y);
+long double hypot(long double x, long double y);
+
+// These functions return their parameter x, raised to the power y.
+float pow(float x, float y);
+long double pow(long double x, long double y);
+double pow(double x, int y);
+float pow(float x, int y);
+long double pow(long double x, int y);
+
+// These functions return the square root of their parameter.
+float sqrt(float x);
+long double sqrt(long double x);
+
+// TODO
+float cbrt(float x);
+long double cbrt(long double x);
+
+// TODO
+float exp(float x);
+long double exp(long double x);
+
+// TODO
+float exp2(float x);
+long double exp2(long double x);
+
+// TODO
+float expm1(float x);
+long double expm1(long double x);
+
+// TODO
+float frexp(float x, int * exponent);
+long double frexp(long double x, int * exponent);
+
+// TODO
+float ldexp(float x, int exponent);
+long double ldexp(long double x, int exponent);
+
+// These functions return the natural logarithm of their parameter.
+float log(float x);
+long double log(long double x);
+
+// These functions return the logarithm (base 10) of their parameter.
+float log10(float x);
+long double log10(long double x);
+
+// These functions return the logarithm (base 2) of their parameter.
+float log2(float x);
+long double log2(long double x);
+
+// TODO
+float logb(float x);
+long double logb(long double x);
+
+// TODO
+int ilogb(float x);
+int ilogb(long double x);
+
+// TODO
+float log1p(float x);
+long double log1p(long double x);
+
+// These functions return the smallest integer no larger than their parameter
+float ceil(float x);
+long double ceil(long double x);
+
+// These functions return the biggest integer no larger than their parameter.
+float floor(float x);
+long double floor(long double x);
+
+// TODO
+float fmod(float x, float y);
+long double fmod(long double x, long double y);
+
+// TODO
+float modf(float x, float * integer);
+long double modf(long double x, long double * integer);
+
+// These functions return their parameter x, with the sign of parameter y.
+float copysign(float x, float y);
+long double copysign(long double x, long double y);
+
+// TODO
+float erf(float x);
+long double erf(long double x);
+
+// TODO
+float erfc(float x);
+long double erfc(long double x);
+
+// TODO
+float fdim(float x, float y);
+long double fdim(long double x, long double y);
+
+// TODO
+float fma(float x, float y, float z);
+long double fma(long double x, long double y, long double z);
+
+// These functions return the larger of their parameters.
+float fmax(float x, float y);
+long double fmax(long double x, long double y);
+
+// These functions return the smaller of their parameters.
+float fmin(float x, float y);
+long double fmin(long double x, long double y);
+
+// TODO
+long long llrint(float x);
+long long llrint(long double x);
+long lrint(float x);
+long lrint(long double x);
+float rint(float x);
+long double rint(long double x);
+
+// TODO
+long long llround(float x);
+long long llround(long double x);
+long lround(float x);
+long lround(long double x);
+float round(float x);
+long double round(long double x);
+
+// TODO
+float trunc(float x);
+long double trunc(long double x);
+
+// TODO
+float nearbyint(float x);
+long double nearbyint(long double x);
+
+// TODO
+float nextafter(float x, float y);
+long double nextafter(long double x, long double y);
+
+// TODO
+float nexttoward(float x, long double y);
+long double nexttoward(long double x, long double y);
+
+// TODO
+float remainder(float x, float y);
+long double remainder(long double x, long double y);
+
+// TODO
+float remquo(float x, float y, int * quotient);
+long double remquo(long double x, long double y, int * quotient);
+
+// TODO
+float scalbn(float x, int ex);
+long double scalbn(long double x, int ex);
+
+// TODO
+float scalbln(float x, long ex);
+long double scalbln(long double x, long ex);
+
+// TODO
+float lgamma(float x);
+long double lgamma(long double x);
+
+// TODO
+float tgamma(float x);
+long double tgamma(long double x);
+
+// ----------------------------------------------------------------------------
+// FUNCTIONS - Standard C
+
+// These functions return the magnitude of its parameter.
+double fabs(double x);
+float fabsf(float x);
+long double fabsl(long double x);
+
+// These functions return the sine of its parameter.
+double sin(double x);
+float sinf(float x);
+long double sinl(long double x);
+
+// These functions return the hyperbolic cosine of its parameter.
+double sinh(double x);
+float sinhf(float x);
+long double sinhl(long double x);
+
+// These functions return the arcsine of its parameter.
+double asin(double x);
+float asinf(float x);
+long double asinl(long double x);
+
+// These functions return the hyperbolic arcsine of their parameter.
+double asinh(double x);
+float asinhf(float x);
+long double asinhl(long double x);
+
+// These functions return the cosine of its parameter.
+double cos(double x);
+float cosf(float x);
+long double cosl(long double x);
+
+// These functions return the hyperbolic cosine of its parameter.
+double cosh(double x);
+float coshf(float x);
+long double coshl(long double x);
+
+// These functions return the arccosine of its parameter.
+double acos(double x);
+float acosf(float x);
+long double acosl(long double x);
+
+// These functions return the hyperbolic arccosine of their parameter.
+double acosh(double x);
+float acoshf(float x);
+long double acoshl(long double x);
+
+// These functions return the tangent of its parameter.
+double tan(double x);
+float tanf(float x);
+long double tanl(long double x);
+
+// These functions return the hyperbolic tangent of its parameter.
+double tanh(double x);
+float tanhf(float x);
+long double tanhl(long double x);
+
+// These functions return the arctangent of its parameter.
+double atan(double x);
+float atanf(float x);
+long double atanl(long double x);
+
+// These functions return the hyperbolic arctangent of their parameter.
+double atanh(double x);
+float atanhf(float x);
+long double atanhl(long double x);
+
+// TODO
+double atan2(double y, double x);
+float atan2f(float y, float x);
+long double atan2l(long double y, long double x);
+
+// These functions return sqrt(x^2 + y^2).
+double hypot(double x, double y);
+float hypotf(float x, float y);
+long double hypotl(long double x, long double y);
+
+// These functions return its parameter x, raised to the power y.
+double pow(double x, double y);
+float powf(float x, float y);
+long double powl(long double x, long double y);
+
+// These functions return the square root of its parameter.
+double sqrt(double x);
+float sqrtf(float x);
+long double sqrtl(long double x);
+
+// TODO
+double cbrt(double x);
+float cbrtf(float x);
+long double cbrtl(long double x);
+
+// TODO
+double exp(double x);
+float expf(float x);
+long double expl(long double x);
+
+// TODO
+double exp2(double x);
+float exp2f(float x);
+long double exp2l(long double x);
+
+// TODO
+double expm1(double x);
+float expm1f(float x);
+long double expm1l(long double x);
+
+// TODO
+double frexp(double x, int * exp);
+float frexpf(float x, int * exp);
+long double frexpl(long double x, int * exp);
+
+// TODO
+double ldexp(double x, int exp);
+float ldexpf(float x, int exp);
+long double ldexpl(long double x, int exp);
+
+// These functions return the natural logarithm of its parameter.
+double log(double x);
+float logf(float x);
+long double logl(long double x);
+
+// These functions return the logarithm (base 10) of its parameter.
+double log10(double x);
+float log10f(float x);
+long double log10l(long double x);
+
+// These functions return the logarithm (base 2) of their parameter.
+double log2(double x);
+float log2f(float x);
+long double log2l(long double x);
+
+// TODO
+double logb(double x);
+float logbf(float x);
+long double logbl(long double x);
+
+// TODO
+int ilogb(double x);
+int ilogbf(float x);
+int ilogbl(long double x);
+
+// TODO
+double log1p(double x);
+float log1pf(float x);
+long double log1pl(long double x);
+
+// These functions return the smallest integer no smaller than value.
+double ceil(double x);
+float ceilf(float x);
+long double ceill(long double x);
+
+// These functions return the largest integer no larger than its parameter.
+double floor(double x);
+float floorf(float x);
+long double floorl(long double x);
+
+// TODO
+double fmod(double x, double y);
+float fmodf(float x, float y);
+long double fmodl(long double x, long double y);
+
+// TODO
+double modf(double x, double * integer);
+float modff(float x, float * integer);
+long double modfl(long double x, long double * integer);
+
+// These functions return their parameter x, with the sign of parameter y.
+double copysign(double x, double y);
+float copysignf(float x, float y);
+long double copysignl(long double x, long double y);
+
+// TODO
+double erf(double x);
+float erff(float x);
+long double erfl(long double x);
+
+// TODO
+double erfc(double x);
+float erfcf(float x);
+long double erfcl(long double x);
+
+// TODO
+double fdim(double x, double y);
+float fdimf(float x, float y);
+long double fdiml(long double x, long double y);
+
+// TODO
+double fma(double x, double y, double z);
+float fmaf(float x, float y, float z);
+long double fmal(long double x, long double y, long double z);
+
+// These functions return the larger of their parameters.
+double fmax(double x, double y);
+float fmaxf(float x, float y);
+long double fmaxl(long double x, long double y);
+
+// These functions return the smaller of their parameters.
+double fmin(double x, double y);
+float fminf(float x, float y);
+long double fminl(long double x, long double y);
+
+// TODO
+long long llrint(double x);
+long long llrintf(float x);
+long long llrintl(long double x);
+long lrint(double x);
+long lrintf(float x);
+long lrintl(long double x);
+double rint(double x);
+float rintf(float x);
+long double rintl(long double x);
+
+// TODO
+long long llround(double x);
+long long llroundf(float x);
+long long llroundl(long double x);
+long lround(double x);
+long lroundf(float x);
+long lroundl(long double x);
+double round(double x);
+float roundf(float x);
+long double roundl(long double x);
+
+// TODO
+double trunc(double x);
+float truncf(float x);
+long double truncl(long double x);
+
+double nearbyint(double x);
+float nearbyintf(float x);
+long double nearbyintl(long double x);
+
+double nextafter(double x, double y);
+float nextafterf(float x, float y);
+long double nextafterl(long double x, long double y);
+
+// TODO
+double nexttoward(double x, long double y);
+float nexttowardf(float x, long double y);
+long double nexttowardl(long double x, long double y);
+
+// TODO
+double remainder(double x, double y);
+float remainderf(float x, float y);
+long double remainderl(long double x, long double y);
+
+// TODO
+double remquo(double x, double y, int * pquo);
+float remquof(float x, float y, int * pquo);
+long double remquol(long double x, long double y, int * pquo);
+
+// TODO
+double scalbn(double x, int ex);
+float scalbnf(float x, int ex);
+long double scalbnl(long double x, int ex);
+
+// TODO
+double scalbln(double x, long ex);
+float scalblnf(float x, long ex);
+long double scalblnl(long double x, long ex);
+
+// TODO
+double lgamma(double x);
+float lgammaf(float x);
+long double lgammal(long double x);
+
+// TODO
+double tgamma(double x);
+float tgammaf(float x);
+long double tgammal(long double x);
+
+// TODO
+double nan(const char *str);
+float nanf(const char *str);
+long double nanl(const char *str);
+
+#endif // __MATH_H