This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/dm/include/math.h

607 lines
15 KiB
C
Raw Permalink Normal View History

/* Copyright (C) 1986-2003 by Digital Mars.
* All Rights Reserved
* www.digitalmars.com
*/
#if __DMC__ || __RCC__
#pragma once
#endif
#ifndef __MATH_H
#define __MATH_H 1
#if __cplusplus
extern "C" {
#endif
/* Define _CRTAPI1 (for compatibility with the NT SDK) */
#ifndef _CRTAPI1
#define _CRTAPI1 __cdecl
#endif
/* Define _CRTAPI2 (for compatibility with the NT SDK) */
#ifndef _CRTAPI2
#define _CRTAPI2 __cdecl
#endif
/* Define CRTIMP */
#ifndef _CRTIMP
#if defined(_WIN32) && defined(_DLL)
#define _CRTIMP __declspec(dllimport)
#else
#define _CRTIMP
#endif
#endif
typedef long double float_t;
typedef long double double_t;
#define HUGE_VAL __inf
#define HUGE_VALF ((float)__inf)
#define HUGE_VALL ((long double)__inf)
#define INFINITY __inf
#define NAN __nan
#ifndef __STDC__
#define NANS __nans
#endif
#define FP_NANS 0
#define FP_NANQ 1
#define FP_INFINITE 2
#define FP_NORMAL 3
#define FP_SUBNORMAL 4
#define FP_ZERO 5
#define FP_NAN FP_NANQ
#define FP_EMPTY 6
#define FP_UNSUPPORTED 7
#if __INTSIZE == 2
#define FP_ILOGB0 (-32768)
#define FP_ILOGBNAN (-32768)
#else
#define FP_ILOGB0 (-2147483647L - 1)
#define FP_ILOGBNAN (-2147483647L - 1)
#endif
#define MATH_ERRNO 1
#define MATH_ERREXCEPT 2
#define math_errhandling (MATH_ERRNO | MATH_ERREXCEPT)
unsigned __cdecl __fpclassify_f(float);
unsigned __cdecl __fpclassify_d(double);
unsigned __cdecl __fpclassify_ld(long double);
unsigned __cdecl __fpxam_ld(long double);
#if __cplusplus
extern "C++" {
inline int fpclassify(float fe) { return __fpclassify_f(fe); }
inline int fpclassify(double fe){ return __fpclassify_d(fe); }
inline int fpclassify(long double fe)
{ return (sizeof(long double) == sizeof(double))
? __fpclassify_d(fe)
: __fpclassify_ld(fe);
}
inline int signbit(float fe) { return ((short *)&(fe))[1] & 0x8000; }
inline int signbit(double fe) { return ((short *)&(fe))[3] & 0x8000; }
inline int signbit(long double fe)
{ return (sizeof(long double) == sizeof(double))
? ((short *)&(fe))[3] & 0x8000
: ((short *)&(fe))[4] & 0x8000;
}
inline int isfinite(float fe) { return fpclassify(fe) >= FP_NORMAL; }
inline int isfinite(double fe) { return fpclassify(fe) >= FP_NORMAL; }
inline int isfinite(long double fe) { return fpclassify(fe) >= FP_NORMAL; }
inline int isnormal(float fe) { return fpclassify(fe) == FP_NORMAL; }
inline int isnormal(double fe) { return fpclassify(fe) == FP_NORMAL; }
inline int isnormal(long double fe) { return fpclassify(fe) == FP_NORMAL; }
inline int isnan(float fe) { return fpclassify(fe) <= FP_NANQ; }
inline int isnan(double fe) { return fpclassify(fe) <= FP_NANQ; }
inline int isnan(long double fe) { return fpclassify(fe) <= FP_NANQ; }
inline int isinf(float fe) { return fpclassify(fe) == FP_INFINITE; }
inline int isinf(double fe) { return fpclassify(fe) == FP_INFINITE; }
inline int isinf(long double fe) { return fpclassify(fe) == FP_INFINITE; }
}
#else
#define fpclassify(fe) (sizeof(fe) == sizeof(float) ? \
__fpclassify_f(fe) : \
(sizeof(fe) == sizeof(double) ? __fpclassify_d(fe) : __fpclassify_ld(fe)) \
)
#if 1
#define signbit __signbit
__inline int __signbit(long double fe)
{ return (sizeof(long double) == sizeof(double))
? ((short *)&(fe))[3] & 0x8000
: ((short *)&(fe))[4] & 0x8000;
}
#else
#define signbit(fe) (sizeof(fe) == sizeof(float) ? \
(int)(((short *)&(fe))[1] & 0x8000) : \
(sizeof(fe) == sizeof(double) ? (int)(((short *)&(fe))[3] & 0x8000) \
: (int)(((short *)&(fe))[4] & 0x8000)) \
)
#endif
#define isfinite(fe) (fpclassify(fe) >= FP_NORMAL)
#define isnormal(fe) (fpclassify(fe) == FP_NORMAL)
#define isnan(fe) (fpclassify(fe) <= FP_NANQ)
#define isinf(fe) (fpclassify(fe) == FP_INFINITE)
#endif
#if __OS2__ && __INTSIZE == 4
#define __CLIB __stdcall
#else
#define __CLIB __cdecl
#endif
double __CLIB acos(double);
float __CLIB acosf(float);
long double __CLIB acosl(long double);
double __CLIB asin(double);
float __CLIB asinf(float);
long double __CLIB asinl(long double);
double __CLIB atan(double);
float __CLIB atanf(float);
long double __CLIB atanl(long double);
double __CLIB atan2(double,double);
float __CLIB atan2f(float,float);
long double __CLIB atan2l(long double, long double);
float __CLIB cosf(float);
#if !(__INLINE_8087 && __I86__ >= 3)
double __CLIB cos(double);
#endif
long double __CLIB cosl(long double);
float __CLIB _inline_cosf(float);
double __CLIB _inline_cos(double);
long double __CLIB _inline_cosl(long double);
#if __INLINE_8087 && __I86__ >= 3
#if __cplusplus
extern "C++" {
inline double cos(double x) { return _inline_cos(x); }
}
#else
#define cos(d) _inline_cos(d)
#endif
#define cosf(f) _inline_cosf(f)
#define cosl(d) _inline_cosl(d)
#elif !_WIN32
#define cosl(d) cos(d)
#endif
//#define _cosl cosl
float __CLIB sinf(float);
#if !(__INLINE_8087 && __I86__ >= 3)
double __CLIB sin(double);
#endif
long double __CLIB sinl(long double);
float __CLIB _inline_sinf(float);
double __CLIB _inline_sin(double);
long double __CLIB _inline_sinl(long double);
#if __INLINE_8087 && __I86__ >= 3
#if __cplusplus
extern "C++" {
inline double sin(double x) { return _inline_sin(x); }
}
#else
#define sin(d) _inline_sin(d)
#endif
#define sinf(f) _inline_sinf(f)
#define sinl(d) _inline_sinl(d)
#elif !_WIN32
#define sinl(d) sin(d)
#endif
double __CLIB tan(double);
float __CLIB tanf(float);
long double __CLIB tanl(long double);
double __CLIB acosh(double x);
float __CLIB acoshf(float x);
long double __CLIB acoshl(long double x);
double __CLIB asinh(double x);
float __CLIB asinhf(float x);
long double __CLIB asinhl(long double x);
double __CLIB atanh(double x);
float __CLIB atanhf(float x);
long double __CLIB atanhl(long double x);
double __CLIB cosh(double);
float __CLIB coshf(float);
long double __CLIB coshl(long double);
double __CLIB sinh(double);
float __CLIB sinhf(float);
long double __CLIB sinhl(long double);
double __CLIB tanh(double);
float __CLIB tanhf(float);
long double __CLIB tanhl(long double);
double __CLIB exp(double);
float __CLIB expf(float);
long double __CLIB expl(long double);
double __CLIB exp2(double);
float __CLIB exp2f(float);
long double __CLIB exp2l(long double);
double __CLIB expm1(double);
float __CLIB expm1f(float);
long double __CLIB expm1l(long double);
double __CLIB frexp(double,int *);
float __CLIB frexpf(float,int *);
#if _WIN32
long double __CLIB frexpl(long double,int *);
#else
#define frexpl frexp
#endif
int __CLIB ilogb(double);
int __CLIB ilogbf(float);
int __CLIB ilogbl(long double);
double __CLIB ldexp(double,int);
float __CLIB ldexpf(float,int);
double __CLIB _inline_ldexp(double,int);
float __CLIB _inline_ldexpf(float,int);
#if _WIN32
long double __CLIB ldexpl(long double, int);
long double __CLIB _inline_ldexpl(long double, int);
#else
#define ldexpl ldexp
#endif
#if __INLINE_8087 && __I86__ >= 3
#define ldexp(d,i) _inline_ldexp(d,i)
#define ldexpf(f,i) _inline_ldexpf(f,i)
#define ldexpl(d,i) _inline_ldexpl(d,i)
#endif
#if __INLINE_8087
long double __cdecl _inline_yl2x(long double x, long double y);
long double __cdecl _inline_yl2xp1(long double x, long double y);
#endif
double __CLIB log(double);
float __CLIB logf(float);
long double __CLIB logl(long double);
double __CLIB log10(double);
float __CLIB log10f(float);
long double __CLIB log10l(long double);
double __CLIB log1p(double);
float __CLIB log1pf(float);
#if _WIN32
long double __CLIB log1pl(long double);
#else
#define log1pl log1p
#endif
double __CLIB log2(double);
float __CLIB log2f(float);
long double __CLIB log2l(long double);
double __CLIB logb(double);
float __CLIB logbf(float);
#if _WIN32
long double __CLIB logbl(long double);
#else
#define logbl logb
#endif
double __CLIB modf(double,double *);
float __CLIB modff(float,float *);
long double __CLIB modfl(long double, long double *);
double __CLIB scalbn(double, int);
float __CLIB scalbnf(float, int);
long double __CLIB scalbnl(long double, int);
double __CLIB scalbln(double, long);
float __CLIB scalblnf(float, long);
long double __CLIB scalblnl(long double, long);
double __CLIB cbrt(double);
float __CLIB cbrtf(float);
long double __CLIB cbrtl(long double);
float __CLIB fabsf(float);
long double __CLIB fabsl(long double);
float __CLIB _inline_fabsf(float);
double __CLIB _inline_fabs(double);
long double __CLIB _inline_fabsl(long double);
#if __cplusplus
extern "C++" {
inline double fabs(double x) { return _inline_fabs(x); }
}
#else
double __CLIB fabs(double);
#define fabs(d) _inline_fabs(d)
#endif
#define fabsf(f) _inline_fabsf(f)
#define fabsl(d) _inline_fabsl(d)
float __CLIB hypotf(float, float);
double __CLIB hypot(double,double);
long double __CLIB hypotl(long double, long double);
double __CLIB pow(double,double);
float __CLIB powf(float,float);
long double __CLIB powl(long double, long double);
float __CLIB sqrtf(float);
#if !__INLINE_8087 && !__cplusplus
double __CLIB sqrt(double);
#endif
long double __CLIB sqrtl(long double);
float __CLIB _inline_sqrtf(float);
double __CLIB _inline_sqrt(double);
long double __CLIB _inline_sqrtl(long double);
#if __INLINE_8087
#if __cplusplus
extern "C++" {
inline double sqrt(double x) { return _inline_sqrt(x); }
}
#else
#define sqrt(d) _inline_sqrt(d)
#endif
#define sqrtf(f) _inline_sqrtf(f)
#define sqrtl(d) _inline_sqrtl(d)
#elif !_WIN32
#define sqrtl(d) sqrt(d)
#endif
double __CLIB erf(double x);
float __CLIB erff(float x);
long double __CLIB erfl(long double x);
double __CLIB erfc(double x);
float __CLIB erfcf(float x);
long double __CLIB erfcl(long double x);
double __CLIB lgamma(double x);
float __CLIB lgammaf(float x);
long double __CLIB lgammal(long double x);
double __CLIB tgamma(double x);
float __CLIB tgammaf(float x);
long double __CLIB tgammal(long double x);
float __CLIB ceilf(float);
double __CLIB ceil(double);
long double __CLIB ceill(long double);
float __CLIB floorf(float);
double __CLIB floor(double);
long double __CLIB floorl(long double);
double __cdecl nearbyint(double);
float __cdecl nearbyintf(float);
long double __cdecl nearbyintl(long double);
#if !_WIN32
#define nearbyintl nearbyint
#endif
float __cdecl rintf(float);
double __cdecl rint(double);
long double __cdecl rintl(long double);
float __cdecl _inline_rintf(float);
double __cdecl _inline_rint(double);
long double __cdecl _inline_rintl(long double);
#if __INLINE_8087
#define rint(d) _inline_rint(d)
#define rintf(f) _inline_rintf(f)
#define rintl(d) _inline_rintl(d)
#elif !_WIN32
#define rintl(d) rint(d)
#endif
long int __cdecl lrint(double x);
long int __cdecl lrintf(float x);
long int __cdecl lrintl(long double x);
#if _WIN32
long long int __cdecl llrint(double x);
long long int __cdecl llrintf(float x);
long long int __cdecl llrintl(long double x);
#endif
double __cdecl round(double );
float __cdecl roundf(float );
long double __cdecl roundl(long double );
#if !_WIN32
#define roundl round
#endif
long int __cdecl lround(double x);
long int __cdecl lroundf(float x);
long int __cdecl lroundl(long double x);
#if _WIN32
long long int __cdecl llround(double x);
long long int __cdecl llroundf(float x);
long long int __cdecl llroundl(long double x);
#endif
double __cdecl trunc(double);
float __cdecl truncf(float);
long double __cdecl truncl(long double);
#if !_WIN32
#define truncl trunc
#endif
double __CLIB fmod(double,double);
float __CLIB fmodf(float,float);
long double __CLIB fmodl(long double, long double);
double __cdecl remainder(double, double);
float __cdecl remainderf(float, float);
long double __cdecl remainderl(long double, long double);
double __cdecl remquo(double, double, int *);
float __cdecl remquof(float, float, int *);
long double __cdecl remquol(long double, long double, int *);
#define remquol remquo
double __cdecl copysign(double, double);
float __cdecl copysignf(float, float);
long double __cdecl copysignl(long double, long double);
#if !_WIN32
#define copysignl copysign
#endif
double __cdecl nan(const char *);
float __cdecl nanf(const char *);
long double __cdecl nanl(const char *);
#if !_WIN32
#define nanl (long double)nan
#endif
double __cdecl nextafter(double, double);
float __cdecl nextafterf(float, float);
long double __cdecl nextafterl(long double, long double);
#define nextafterl (long double)nextafter
double __cdecl nexttoward(double, double);
float __cdecl nexttowardf(float, float);
long double __cdecl nexttowardl(long double, long double);
double __cdecl fdim(double, double);
float __cdecl fdimf(float, float);
long double __cdecl fdiml(long double, long double);
double __cdecl fmax(double, double);
float __cdecl fmaxf(float, float);
long double __cdecl fmaxl(long double, long double);
double __cdecl fmin(double, double);
float __cdecl fminf(float, float);
long double __cdecl fminl(long double, long double);
double __cdecl fma(double, double, double);
float __cdecl fmaf(float, float, float);
long double __cdecl fmal(long double, long double, long double);
#define isgreater(x,y) !((x) !> (y))
#define isgreaterequal(x,y) !((x) !>= (y))
#define isless(x,y) !((x) !< (y))
#define islessequal(x,y) !((x) !<= (y))
#define islessgreater(x,y) !((x) !<> (y))
#define isunordered(x,y) ((x) !<>= (y))
#ifndef __STDC__
#define _matherrl _matherr
#if 0 // obsolete
#define PI 3.14159265358979323846
#define LOG2 0.30102999566398119521
#define LN2 0.6931471805599453094172321
#define LOG2T 3.32192809488736234787
#define LOG2E 1.4426950408889634074
#endif
#define M_LOG2T 3.32192809488736234787
#define M_LOG2 0.30102999566398119521
#define M_LOG2E 1.4426950408889634074
#define M_LN2 0.6931471805599453094172321
#define M_PI 3.14159265358979323846
#define M_E 2.7182818284590452354
#define M_LOG10E 0.43429448190325182765
#define M_LN10 2.30258509299404568402
#define M_PI_2 1.57079632679489661923
#define M_PI_4 0.78539816339744830962
#define M_1_PI 0.31830988618379067154
#define M_2_PI 0.63661977236758134308
#define M_2_SQRTPI 1.12837916709551257390
#define M_SQRT2 1.41421356237309504880
#define M_SQRT1_2 0.70710678118654752440
// 80 bit
#define M_PI_L 0x1.921fb54442d1846ap+1L // 3.14159 fldpi
#define M_LOG2T_L 0x1.a934f0979a3715fcp+1L // 3.32193 fldl2t
#define M_LOG2E_L 0x1.71547652b82fe178p+0L // 1.4427 fldl2e
#define M_LOG2_L 0x1.34413509f79fef32p-2L // 0.30103 fldlg2
#define M_LN2_L 0x1.62e42fefa39ef358p-1L // 0.693147 fldln2
#ifndef _EXCEPTION_DEFINED
struct _exception
{ int type;
char *name;
double arg1;
double arg2;
double retval;
};
#if !__STDC__
#define exception _exception
#endif
#define _exceptionl _exception
#define _EXCEPTION_DEFINED
#endif
#define _DOMAIN 1
#define _SING 2
#define _OVERFLOW 3
#define _UNDERFLOW 4
#define _TLOSS 5
#define _PLOSS 6
#define EDOM 33
#define ERANGE 34
#ifndef __STDC__
#define DOMAIN _DOMAIN
#define SING _SING
#define OVERFLOW _OVERFLOW
#define UNDERFLOW _UNDERFLOW
#define TLOSS _TLOSS
#define PLOSS _PLOSS
#define DIVIDE_BY_ZERO 7
#endif
int __CLIB matherr(struct exception *);
double __CLIB atof(const char *);
#define _atold atof
#define _matherr matherr
double __CLIB poly(double,int,double []);
#define polyl poly
double _poly87(double, int, double []);
#if __INLINE_8087
#define poly _poly87
#endif
#endif
#if __cplusplus
}
#endif
#endif