| /* $OpenBSD: math.h,v 1.27 2010/12/14 11:16:15 martynas Exp $ */ |
| /* |
| * ==================================================== |
| * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. |
| * |
| * Developed at SunPro, a Sun Microsystems, Inc. business. |
| * Permission to use, copy, modify, and distribute this |
| * software is freely granted, provided that this notice |
| * is preserved. |
| * ==================================================== |
| */ |
| |
| /* |
| * from: @(#)fdlibm.h 5.1 93/09/24 |
| */ |
| |
| #ifndef _MATH_H_ |
| #define _MATH_H_ |
| |
| #include <sys/_types.h> |
| #include <sys/cdefs.h> |
| #include <sys/limits.h> |
| |
| #include <float.h> |
| |
| typedef __float_t float_t; |
| typedef __double_t double_t; |
| |
| #define FP_NAN 0x00 |
| #define FP_INFINITE 0x01 |
| #define FP_ZERO 0x02 |
| #define FP_SUBNORMAL 0x03 |
| #define FP_NORMAL 0x04 |
| |
| #define FP_ILOGB0 (-INT_MAX - 1) |
| #define FP_ILOGBNAN (-INT_MAX - 1) |
| |
| #define fpclassify(x) \ |
| ((sizeof (x) == sizeof (float)) ? \ |
| __fpclassifyf(x) \ |
| : (sizeof (x) == sizeof (double)) ? \ |
| __fpclassify(x) \ |
| : __fpclassifyl(x)) |
| #define isfinite(x) \ |
| ((sizeof (x) == sizeof (float)) ? \ |
| __isfinitef(x) \ |
| : (sizeof (x) == sizeof (double)) ? \ |
| __isfinite(x) \ |
| : __isfinitel(x)) |
| #define isnormal(x) \ |
| ((sizeof (x) == sizeof (float)) ? \ |
| __isnormalf(x) \ |
| : (sizeof (x) == sizeof (double)) ? \ |
| __isnormal(x) \ |
| : __isnormall(x)) |
| #define signbit(x) \ |
| ((sizeof (x) == sizeof (float)) ? \ |
| __signbitf(x) \ |
| : (sizeof (x) == sizeof (double)) ? \ |
| __signbit(x) \ |
| : __signbitl(x)) |
| #define isinf(x) \ |
| ((sizeof (x) == sizeof (float)) ? \ |
| __isinff(x) \ |
| : (sizeof (x) == sizeof (double)) ? \ |
| __isinf(x) \ |
| : __isinfl(x)) |
| #define isnan(x) \ |
| ((sizeof (x) == sizeof (float)) ? \ |
| __isnanf(x) \ |
| : (sizeof (x) == sizeof (double)) ? \ |
| __isnan(x) \ |
| : __isnanl(x)) |
| |
| #define isgreater(x, y) (!isunordered((x), (y)) && (x) > (y)) |
| #define isgreaterequal(x, y) (!isunordered((x), (y)) && (x) >= (y)) |
| #define isless(x, y) (!isunordered((x), (y)) && (x) < (y)) |
| #define islessequal(x, y) (!isunordered((x), (y)) && (x) <= (y)) |
| #define islessgreater(x, y) (!isunordered((x), (y)) && ((x) > (y) || (y) > (x))) |
| #define isunordered(x, y) (isnan(x) || isnan(y)) |
| |
| __BEGIN_DECLS |
| |
| extern char __infinity[]; |
| #define HUGE_VAL (*(double *)(void *)__infinity) |
| #define HUGE_VALF ((float)HUGE_VAL) |
| #define HUGE_VALL ((long double)HUGE_VAL) |
| #define INFINITY HUGE_VALF |
| extern char __nan[]; |
| #define NAN (*(float *)(void *)__nan) |
| |
| /* |
| * ANSI/POSIX |
| */ |
| double _TLIBC_CDECL_ acos(double); |
| double _TLIBC_CDECL_ asin(double); |
| double _TLIBC_CDECL_ atan(double); |
| double _TLIBC_CDECL_ atan2(double, double); |
| double _TLIBC_CDECL_ cos(double); |
| double _TLIBC_CDECL_ sin(double); |
| double _TLIBC_CDECL_ tan(double); |
| |
| double _TLIBC_CDECL_ cosh(double); |
| double _TLIBC_CDECL_ sinh(double); |
| double _TLIBC_CDECL_ tanh(double); |
| |
| double _TLIBC_CDECL_ exp(double); |
| double _TLIBC_CDECL_ frexp(double, int *); |
| double _TLIBC_CDECL_ ldexp(double, int); |
| double _TLIBC_CDECL_ log(double); |
| double _TLIBC_CDECL_ log10(double); |
| double _TLIBC_CDECL_ modf(double, double *); |
| |
| double _TLIBC_CDECL_ pow(double, double); |
| double _TLIBC_CDECL_ sqrt(double); |
| |
| double _TLIBC_CDECL_ ceil(double); |
| double _TLIBC_CDECL_ fabs(double); |
| double _TLIBC_CDECL_ floor(double); |
| double _TLIBC_CDECL_ fmod(double, double); |
| |
| /* |
| * C99 |
| */ |
| double _TLIBC_CDECL_ acosh(double); |
| double _TLIBC_CDECL_ asinh(double); |
| double _TLIBC_CDECL_ atanh(double); |
| |
| double _TLIBC_CDECL_ exp2(double); |
| double _TLIBC_CDECL_ expm1(double); |
| int _TLIBC_CDECL_ ilogb(double); |
| double _TLIBC_CDECL_ log1p(double); |
| double _TLIBC_CDECL_ log2(double); |
| double _TLIBC_CDECL_ logb(double); |
| double _TLIBC_CDECL_ scalbn(double, int); |
| double _TLIBC_CDECL_ scalbln(double, long int); |
| |
| double _TLIBC_CDECL_ cbrt(double); |
| double _TLIBC_CDECL_ hypot(double, double); |
| |
| double _TLIBC_CDECL_ erf(double); |
| double _TLIBC_CDECL_ erfc(double); |
| double _TLIBC_CDECL_ lgamma(double); |
| double _TLIBC_CDECL_ tgamma(double); |
| |
| double _TLIBC_CDECL_ nearbyint(double); |
| double _TLIBC_CDECL_ rint(double); |
| long int _TLIBC_CDECL_ lrint(double); |
| long long int _TLIBC_CDECL_ llrint(double); |
| double _TLIBC_CDECL_ round(double); |
| long int _TLIBC_CDECL_ lround(double); |
| long long int _TLIBC_CDECL_ llround(double); |
| double _TLIBC_CDECL_ trunc(double); |
| |
| double _TLIBC_CDECL_ remainder(double, double); |
| double _TLIBC_CDECL_ remquo(double, double, int *); |
| |
| double _TLIBC_CDECL_ copysign(double, double); |
| double _TLIBC_CDECL_ nan(const char *); |
| double _TLIBC_CDECL_ nextafter(double, double); |
| |
| double _TLIBC_CDECL_ fdim(double, double); |
| double _TLIBC_CDECL_ fmax(double, double); |
| double _TLIBC_CDECL_ fmin(double, double); |
| |
| double _TLIBC_CDECL_ fma(double, double, double); |
| |
| /* |
| * Float versions of C99 functions |
| */ |
| |
| float _TLIBC_CDECL_ acosf(float); |
| float _TLIBC_CDECL_ asinf(float); |
| float _TLIBC_CDECL_ atanf(float); |
| float _TLIBC_CDECL_ atan2f(float, float); |
| float _TLIBC_CDECL_ cosf(float); |
| float _TLIBC_CDECL_ sinf(float); |
| float _TLIBC_CDECL_ tanf(float); |
| |
| float _TLIBC_CDECL_ acoshf(float); |
| float _TLIBC_CDECL_ asinhf(float); |
| float _TLIBC_CDECL_ atanhf(float); |
| float _TLIBC_CDECL_ coshf(float); |
| float _TLIBC_CDECL_ sinhf(float); |
| float _TLIBC_CDECL_ tanhf(float); |
| |
| float _TLIBC_CDECL_ expf(float); |
| float _TLIBC_CDECL_ exp2f(float); |
| float _TLIBC_CDECL_ expm1f(float); |
| float _TLIBC_CDECL_ frexpf(float, int *); |
| int _TLIBC_CDECL_ ilogbf(float); |
| float _TLIBC_CDECL_ ldexpf(float, int); |
| float _TLIBC_CDECL_ logf(float); |
| float _TLIBC_CDECL_ log10f(float); |
| float _TLIBC_CDECL_ log1pf(float); |
| float _TLIBC_CDECL_ log2f(float); |
| float _TLIBC_CDECL_ logbf(float); |
| float _TLIBC_CDECL_ modff(float, float *); |
| float _TLIBC_CDECL_ scalbnf(float, int); |
| float _TLIBC_CDECL_ scalblnf(float, long int); |
| |
| float _TLIBC_CDECL_ cbrtf(float); |
| float _TLIBC_CDECL_ fabsf(float); |
| float _TLIBC_CDECL_ hypotf(float, float); |
| float _TLIBC_CDECL_ powf(float, float); |
| float _TLIBC_CDECL_ sqrtf(float); |
| |
| float _TLIBC_CDECL_ erff(float); |
| float _TLIBC_CDECL_ erfcf(float); |
| float _TLIBC_CDECL_ lgammaf(float); |
| float _TLIBC_CDECL_ tgammaf(float); |
| |
| float _TLIBC_CDECL_ ceilf(float); |
| float _TLIBC_CDECL_ floorf(float); |
| float _TLIBC_CDECL_ nearbyintf(float); |
| |
| float _TLIBC_CDECL_ rintf(float); |
| long int _TLIBC_CDECL_ lrintf(float); |
| long long int _TLIBC_CDECL_ llrintf(float); |
| float _TLIBC_CDECL_ roundf(float); |
| long int _TLIBC_CDECL_ lroundf(float); |
| long long int _TLIBC_CDECL_ llroundf(float); |
| float _TLIBC_CDECL_ truncf(float); |
| |
| float _TLIBC_CDECL_ fmodf(float, float); |
| float _TLIBC_CDECL_ remainderf(float, float); |
| float _TLIBC_CDECL_ remquof(float, float, int *); |
| |
| float _TLIBC_CDECL_ copysignf(float, float); |
| float _TLIBC_CDECL_ nanf(const char *); |
| float _TLIBC_CDECL_ nextafterf(float, float); |
| |
| float _TLIBC_CDECL_ fdimf(float, float); |
| float _TLIBC_CDECL_ fmaxf(float, float); |
| float _TLIBC_CDECL_ fminf(float, float); |
| |
| float _TLIBC_CDECL_ fmaf(float, float, float); |
| |
| /* |
| * Long double versions of C99 functions |
| */ |
| |
| /* Macros defining long double functions to be their double counterparts |
| * (long double is synonymous with double in this implementation). |
| */ |
| |
| long double _TLIBC_CDECL_ acosl(long double); |
| long double _TLIBC_CDECL_ asinl(long double); |
| long double _TLIBC_CDECL_ atanl(long double); |
| long double _TLIBC_CDECL_ atan2l(long double, long double); |
| long double _TLIBC_CDECL_ cosl(long double); |
| long double _TLIBC_CDECL_ sinl(long double); |
| long double _TLIBC_CDECL_ tanl(long double); |
| |
| long double _TLIBC_CDECL_ acoshl(long double); |
| long double _TLIBC_CDECL_ asinhl(long double); |
| long double _TLIBC_CDECL_ atanhl(long double); |
| long double _TLIBC_CDECL_ coshl(long double); |
| long double _TLIBC_CDECL_ sinhl(long double); |
| long double _TLIBC_CDECL_ tanhl(long double); |
| |
| long double _TLIBC_CDECL_ expl(long double); |
| long double _TLIBC_CDECL_ exp2l(long double); |
| long double _TLIBC_CDECL_ expm1l(long double); |
| long double _TLIBC_CDECL_ frexpl(long double, int *); |
| int _TLIBC_CDECL_ ilogbl(long double); |
| long double _TLIBC_CDECL_ ldexpl(long double, int); |
| long double _TLIBC_CDECL_ logl(long double); |
| long double _TLIBC_CDECL_ log10l(long double); |
| long double _TLIBC_CDECL_ log1pl(long double); |
| long double _TLIBC_CDECL_ log2l(long double); |
| long double _TLIBC_CDECL_ logbl(long double); |
| long double _TLIBC_CDECL_ modfl(long double, long double *); |
| long double _TLIBC_CDECL_ scalbnl(long double, int); |
| long double _TLIBC_CDECL_ scalblnl(long double, long int); |
| |
| long double _TLIBC_CDECL_ cbrtl(long double); |
| long double _TLIBC_CDECL_ fabsl(long double); |
| long double _TLIBC_CDECL_ hypotl(long double, long double); |
| long double _TLIBC_CDECL_ powl(long double, long double); |
| long double _TLIBC_CDECL_ sqrtl(long double); |
| |
| long double _TLIBC_CDECL_ erfl(long double); |
| long double _TLIBC_CDECL_ erfcl(long double); |
| long double _TLIBC_CDECL_ lgammal(long double); |
| long double _TLIBC_CDECL_ tgammal(long double); |
| |
| long double _TLIBC_CDECL_ ceill(long double); |
| long double _TLIBC_CDECL_ floorl(long double); |
| long double _TLIBC_CDECL_ nearbyintl(long double); |
| long double _TLIBC_CDECL_ rintl(long double); |
| long int _TLIBC_CDECL_ lrintl(long double); |
| long long int _TLIBC_CDECL_ llrintl(long double); |
| long double _TLIBC_CDECL_ roundl(long double); |
| long int _TLIBC_CDECL_ lroundl(long double); |
| long long int _TLIBC_CDECL_ llroundl(long double); |
| long double _TLIBC_CDECL_ truncl(long double); |
| |
| long double _TLIBC_CDECL_ fmodl(long double, long double); |
| long double _TLIBC_CDECL_ remainderl(long double, long double); |
| long double _TLIBC_CDECL_ remquol(long double, long double, int *); |
| |
| long double _TLIBC_CDECL_ copysignl(long double, long double); |
| long double _TLIBC_CDECL_ nanl(const char *); |
| long double _TLIBC_CDECL_ nextafterl(long double, long double); |
| |
| long double _TLIBC_CDECL_ fdiml(long double, long double); |
| long double _TLIBC_CDECL_ fmaxl(long double, long double); |
| long double _TLIBC_CDECL_ fminl(long double, long double); |
| long double _TLIBC_CDECL_ fmal(long double, long double, long double); |
| |
| /* nexttoward(): |
| * The implementation in Intel math library is incompatible with MSVC. |
| * Because sizeof(long double) is 8bytes with MSVC, |
| * but the expected long double size is 10bytes. |
| * And by default, MSVC doesn't provide nexttoward(). |
| * So we only provide Linux version here. |
| */ |
| double _TLIBC_CDECL_ nexttoward(double, long double); |
| float _TLIBC_CDECL_ nexttowardf(float, long double); |
| |
| long double _TLIBC_CDECL_ nexttowardl(long double, long double); |
| |
| /* |
| * Library implementation |
| */ |
| int _TLIBC_CDECL_ __fpclassify(double); |
| int _TLIBC_CDECL_ __fpclassifyf(float); |
| int _TLIBC_CDECL_ __isfinite(double); |
| int _TLIBC_CDECL_ __isfinitef(float); |
| int _TLIBC_CDECL_ __isinf(double); |
| int _TLIBC_CDECL_ __isinff(float); |
| int _TLIBC_CDECL_ __isnan(double); |
| int _TLIBC_CDECL_ __isnanf(float); |
| int _TLIBC_CDECL_ __isnormal(double); |
| int _TLIBC_CDECL_ __isnormalf(float); |
| int _TLIBC_CDECL_ __signbit(double); |
| int _TLIBC_CDECL_ __signbitf(float); |
| |
| int _TLIBC_CDECL_ __fpclassifyl(long double); |
| int _TLIBC_CDECL_ __isfinitel(long double); |
| int _TLIBC_CDECL_ __isinfl(long double); |
| int _TLIBC_CDECL_ __isnanl(long double); |
| int _TLIBC_CDECL_ __isnormall(long double); |
| int _TLIBC_CDECL_ __signbitl(long double); |
| |
| /* |
| * Non-C99 functions. |
| */ |
| double _TLIBC_CDECL_ drem(double, double); |
| double _TLIBC_CDECL_ exp10(double); |
| double _TLIBC_CDECL_ gamma(double); |
| double _TLIBC_CDECL_ gamma_r(double, int *); |
| double _TLIBC_CDECL_ j0(double); |
| double _TLIBC_CDECL_ j1(double); |
| double _TLIBC_CDECL_ jn(int, double); |
| double _TLIBC_CDECL_ lgamma_r(double, int *); |
| double _TLIBC_CDECL_ pow10(double); |
| double _TLIBC_CDECL_ scalb(double, double); |
| /* C99 Macro signbit.*/ |
| double _TLIBC_CDECL_ significand(double); |
| void _TLIBC_CDECL_ sincos(double, double *, double *); |
| double _TLIBC_CDECL_ y0(double); |
| double _TLIBC_CDECL_ y1(double); |
| double _TLIBC_CDECL_ yn(int, double); |
| /* C99 Macro isinf.*/ |
| /* C99 Macro isnan.*/ |
| int _TLIBC_CDECL_ finite(double); |
| |
| float _TLIBC_CDECL_ dremf(float, float); |
| float _TLIBC_CDECL_ exp10f(float); |
| float _TLIBC_CDECL_ gammaf(float); |
| float _TLIBC_CDECL_ gammaf_r(float, int *); |
| float _TLIBC_CDECL_ j0f(float); |
| float _TLIBC_CDECL_ j1f(float); |
| float _TLIBC_CDECL_ jnf(int, float); |
| float _TLIBC_CDECL_ lgammaf_r(float, int *); |
| float _TLIBC_CDECL_ pow10f(float); |
| float _TLIBC_CDECL_ scalbf(float, float); |
| int _TLIBC_CDECL_ signbitf(float); |
| float _TLIBC_CDECL_ significandf(float); |
| void _TLIBC_CDECL_ sincosf(float, float *, float *); |
| float _TLIBC_CDECL_ y0f(float); |
| float _TLIBC_CDECL_ y1f(float); |
| float _TLIBC_CDECL_ ynf(int, float); |
| int _TLIBC_CDECL_ finitef(float); |
| int _TLIBC_CDECL_ isinff(float); |
| int _TLIBC_CDECL_ isnanf(float); |
| |
| long double _TLIBC_CDECL_ dreml(long double, long double); |
| long double _TLIBC_CDECL_ exp10l(long double); |
| long double _TLIBC_CDECL_ gammal(long double); |
| long double _TLIBC_CDECL_ gammal_r(long double, int *); |
| long double _TLIBC_CDECL_ j0l(long double); |
| long double _TLIBC_CDECL_ j1l(long double); |
| long double _TLIBC_CDECL_ jnl(int, long double); |
| long double _TLIBC_CDECL_ lgammal_r(long double, int *); |
| long double _TLIBC_CDECL_ pow10l(long double); |
| long double _TLIBC_CDECL_ scalbl(long double, long double); |
| int _TLIBC_CDECL_ signbitl(long double); |
| long double _TLIBC_CDECL_ significandl(long double); |
| void _TLIBC_CDECL_ sincosl(long double, long double *, long double *); |
| long double _TLIBC_CDECL_ y1l(long double); |
| long double _TLIBC_CDECL_ y0l(long double); |
| long double _TLIBC_CDECL_ ynl(int, long double); |
| int _TLIBC_CDECL_ finitel(long double); |
| int _TLIBC_CDECL_ isinfl(long double); |
| int _TLIBC_CDECL_ isnanl(long double); |
| |
| /* |
| * TODO: From Intel Decimal Floating-Point Math Library |
| * signbitd32/signbitd64/signbitd128, finited32/finited64/finited128 |
| * isinfd32/isinfd64/isinfd128, isnand32/isnand64/isnand128 |
| */ |
| #if defined(__cplusplus) |
| /* Clang does not support decimal floating point types. |
| * |
| * c.f.: |
| * http://clang.llvm.org/docs/UsersManual.html#gcc-extensions-not-implemented-yet |
| */ |
| #if !defined(__clang__) |
| typedef float _Decimal32 __attribute__((mode(SD))); |
| typedef float _Decimal64 __attribute__((mode(DD))); |
| typedef float _Decimal128 __attribute__((mode(TD))); |
| #endif |
| #endif |
| |
| __END_DECLS |
| |
| #endif /* !_MATH_H_ */ |