//
// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
//
// The contents of this file are covered under the licence agreement in the
// file "LICENCE" distributed with Cforall.
//
// math --
//
// Author           : Peter A. Buhr
// Created On       : Mon Apr 18 23:37:04 2016
// Last Modified By : Peter A. Buhr
// Last Modified On : Wed May 24 17:40:39 2017
// Update Count     : 60
//

#ifndef MATH_H
#define MATH_H

extern "C" {
#include <math.h>										// fpclassify, isfinite, isnormal, isnan, isinf
} // extern "C"

float ?%?( float, float );
float fmod( float, float );
double ?%?( double, double );
// extern "C" { double fmod( double, double ); }
long double ?%?( long double, long double );
long double fmod( long double, long double );

float remainder( float, float );
// extern "C" { double remainder( double, double ); }
long double remainder( long double, long double );

[ int, float ] remquo( float, float );
float remquo( float, float, int * );
[ int, double ] remquo( double, double );
// extern "C" { double remquo( double, double, int * ); }
[ int, long double ] remquo( long double, long double );
long double remquo( long double, long double, int * );

[ int, float ] div( float, float );						// alternative name for remquo
float div( float, float, int * );
[ int, double ] div( double, double );
// extern "C" { double div( double, double, int * ); }
[ int, long double ] div( long double, long double );
long double div( long double, long double, int * );

float fma( float, float, float );
// extern "C" { double fma( double, double, double ); }
long double fma( long double, long double, long double );

float fdim( float, float );
// extern "C" { double fdim( double, double ); }
long double fdim( long double, long double );

float nan( const char * );
// extern "C" { double nan( const char * ); }
long double nan( const char * );

//---------------------- Exponential ----------------------

float exp( float );
// extern "C" { double exp( double ); }
long double exp( long double );
float _Complex exp( float _Complex );
double _Complex exp( double _Complex );
long double _Complex exp( long double _Complex );

float exp2( float );
// extern "C" { double exp2( double ); }
long double exp2( long double );
// float _Complex exp2( float _Complex );
// double _Complex exp2( double _Complex );
// long double _Complex exp2( long double _Complex );

float expm1( float );
// extern "C" { double expm1( double ); }
long double expm1( long double );

float log( float );
// extern "C" { double log( double ); }
long double log( long double );
float _Complex log( float _Complex );
double _Complex log( double _Complex );
long double _Complex log( long double _Complex );

float log2( float );
// extern "C" { double log2( double ); }
long double log2( long double );
// float _Complex log2( float _Complex );
// double _Complex log2( double _Complex );
// long double _Complex log2( long double _Complex );

float log10( float );
// extern "C" { double log10( double ); }
long double log10( long double );
// float _Complex log10( float _Complex );
// double _Complex log10( double _Complex );
// long double _Complex log10( long double _Complex );

float log1p( float );
// extern "C" { double log1p( double ); }
long double log1p( long double );

int ilogb( float );
// extern "C" { int ilogb( double ); }
int ilogb( long double );

float logb( float );
// extern "C" { double logb( double ); }
long double logb( long double );

//---------------------- Power ----------------------

float sqrt( float );
// extern "C" { double sqrt( double ); }
long double sqrt( long double );
float _Complex sqrt( float _Complex );
double _Complex sqrt( double _Complex );
long double _Complex sqrt( long double _Complex );

float cbrt( float );
// extern "C" { double cbrt( double ); }
long double cbrt( long double );

float hypot( float, float );
// extern "C" { double hypot( double, double ); }
long double hypot( long double, long double );

float pow( float, float );
// extern "C" { double pow( double, double ); }
long double pow( long double, long double );
float _Complex pow( float _Complex, float _Complex );
double _Complex pow( double _Complex, double _Complex );
long double _Complex pow( long double _Complex, long double _Complex );

//---------------------- Trigonometric ----------------------

float sin( float );
// extern "C" { double sin( double ); }
long double sin( long double );
float _Complex sin( float _Complex );
double _Complex sin( double _Complex );
long double _Complex sin( long double _Complex );

float cos( float );
// extern "C" { double cos( double ); }
long double cos( long double );
float _Complex cos( float _Complex );
double _Complex cos( double _Complex );
long double _Complex cos( long double _Complex );

float tan( float );
// extern "C" { double tan( double ); }
long double tan( long double );
float _Complex tan( float _Complex );
double _Complex tan( double _Complex );
long double _Complex tan( long double _Complex );

float asin( float );
// extern "C" { double asin( double ); }
long double asin( long double );
float _Complex asin( float _Complex );
double _Complex asin( double _Complex );
long double _Complex asin( long double _Complex );

float acos( float );
// extern "C" { double acos( double ); }
long double acos( long double );
float _Complex acos( float _Complex );
double _Complex acos( double _Complex );
long double _Complex acos( long double _Complex );

float atan( float );
// extern "C" { double atan( double ); }
long double atan( long double );
float _Complex atan( float _Complex );
double _Complex atan( double _Complex );
long double _Complex atan( long double _Complex );

float atan2( float, float );
// extern "C" { double atan2( double, double ); }
long double atan2( long double, long double );

float atan( float, float );								// alternative name for atan2
double atan( double, double );
long double atan( long double, long double );

//---------------------- Hyperbolic ----------------------

float sinh( float );
// extern "C" { double sinh( double ); }
long double sinh( long double );
float _Complex sinh( float _Complex );
double _Complex sinh( double _Complex );
long double _Complex sinh( long double _Complex );

float cosh( float );
// extern "C" { double cosh( double ); }
long double cosh( long double );
float _Complex cosh( float _Complex );
double _Complex cosh( double _Complex );
long double _Complex cosh( long double _Complex );

float tanh( float );
// extern "C" { double tanh( double ); }
long double tanh( long double );
float _Complex tanh( float _Complex );
double _Complex tanh( double _Complex );
long double _Complex tanh( long double _Complex );

float asinh( float );
// extern "C" { double asinh( double ); }
long double asinh( long double );
float _Complex asinh( float _Complex );
double _Complex asinh( double _Complex );
long double _Complex asinh( long double _Complex );

float acosh( float );
// extern "C" { double acosh( double ); }
long double acosh( long double );
float _Complex acosh( float _Complex );
double _Complex acosh( double _Complex );
long double _Complex acosh( long double _Complex );

float atanh( float );
// extern "C" { double atanh( double ); }
long double atanh( long double );
float _Complex atanh( float _Complex );
double _Complex atanh( double _Complex );
long double _Complex atanh( long double _Complex );

//---------------------- Error / Gamma ----------------------

float erf( float );
// extern "C" { double erf( double ); }
long double erf( long double );
// float _Complex erf( float _Complex );
// double _Complex erf( double _Complex );
// long double _Complex erf( long double _Complex );

float erfc( float );
// extern "C" { double erfc( double ); }
long double erfc( long double );
// float _Complex erfc( float _Complex );
// double _Complex erfc( double _Complex );
// long double _Complex erfc( long double _Complex );

float lgamma( float );
// extern "C" { double lgamma( double ); }
long double lgamma( long double );
float lgamma( float, int * );
double lgamma( double, int * );
long double lgamma( long double, int * );

float tgamma( float );
// extern "C" { double tgamma( double ); }
long double tgamma( long double );

//---------------------- Nearest Integer ----------------------

float floor( float );
// extern "C" { double floor( double ); }
long double floor( long double );

float ceil( float );
// extern "C" { double ceil( double ); }
long double ceil( long double );

float trunc( float );
// extern "C" { double trunc( double ); }
long double trunc( long double );

float rint( float );
long double rint( long double );
long int rint( float );
long int rint( double );
long int rint( long double );
long long int rint( float );
long long int rint( double );
long long int rint( long double );

long int lrint( float );
// extern "C" { long int lrint( double ); }
long int lrint( long double );
long long int llrint( float );
// extern "C" { long long int llrint( double ); }
long long int llrint( long double );

float nearbyint( float );
// extern "C" { double nearbyint( double ); }
long double nearbyint( long double );

float round( float );
long double round( long double );
long int round( float );
long int round( double );
long int round( long double );
long long int round( float );
long long int round( double );
long long int round( long double );

long int lround( float );
// extern "C" { long int lround( double ); }
long int lround( long double );
long long int llround( float );
// extern "C" { long long int llround( double ); }
long long int llround( long double );

//---------------------- Manipulation ----------------------

float copysign( float, float );
// extern "C" { double copysign( double, double ); }
long double copysign( long double, long double );

float frexp( float, int * );
// extern "C" { double frexp( double, int * ); }
long double frexp( long double, int * );

float ldexp( float, int );
// extern "C" { double ldexp( double, int ); }
long double ldexp( long double, int );

[ float, float ] modf( float );
float modf( float, float * );
[ double, double ] modf( double );
// extern "C" { double modf( double, double * ); }
[ long double, long double ] modf( long double );
long double modf( long double, long double * );

float nextafter( float, float );
// extern "C" { double nextafter( double, double ); }
long double nextafter( long double, long double );

float nexttoward( float, long double );
// extern "C" { double nexttoward( double, long double ); }
long double nexttoward( long double, long double );

float scalbn( float, int );
// extern "C" { double scalbn( double, int ); }
long double scalbn( long double, int );

float scalbln( float, long int );
// extern "C" { double scalbln( double, long int ); }
long double scalbln( long double, long int );

#endif // MATH_H

// Local Variables: //
// mode: c //
// tab-width: 4 //
// End: //
