Annotation of src/include/math.h, Revision 1.18
1.18 ! martynas 1: /* $OpenBSD: math.h,v 1.17 2008/07/21 20:50:54 martynas Exp $ */
1.1 deraadt 2: /*
3: * ====================================================
4: * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
5: *
6: * Developed at SunPro, a Sun Microsystems, Inc. business.
7: * Permission to use, copy, modify, and distribute this
8: * software is freely granted, provided that this notice
9: * is preserved.
10: * ====================================================
11: */
12:
13: /*
1.3 millert 14: * from: @(#)fdlibm.h 5.1 93/09/24
1.1 deraadt 15: */
16:
17: #ifndef _MATH_H_
18: #define _MATH_H_
19:
1.17 martynas 20: #include <sys/_types.h>
1.11 millert 21: #include <sys/cdefs.h>
1.18 ! martynas 22: #include <sys/limits.h>
1.11 millert 23:
1.1 deraadt 24: /*
25: * ANSI/POSIX
26: */
27: extern char __infinity[];
1.12 otto 28: #define HUGE_VAL (*(double *)(void *)__infinity)
1.9 espie 29:
1.18 ! martynas 30: /*
1.9 espie 31: * C99
32: */
1.18 ! martynas 33: #if __ISO_C_VISIBLE >= 1999
! 34: typedef __double_t double_t;
! 35: typedef __float_t float_t;
! 36:
! 37: #define HUGE_VALF ((float)HUGE_VAL)
! 38: #define HUGE_VALL ((long double)HUGE_VAL)
! 39: #define INFINITY HUGE_VALF
! 40: #if 0 /* XXX */
! 41: #define NAN nan("")
! 42: #endif /* XXX */
! 43:
! 44: #define FP_INFINITE 0x01
! 45: #define FP_NAN 0x02
! 46: #define FP_NORMAL 0x04
! 47: #define FP_SUBNORMAL 0x08
! 48: #define FP_ZERO 0x10
! 49:
! 50: #define FP_ILOGB0 (-INT_MAX)
! 51: #define FP_ILOGBNAN INT_MAX
! 52:
! 53: #if 0 /* XXX */
! 54: #define fpclassify(x) \
! 55: ((sizeof (x) == sizeof (float)) ? \
! 56: __fpclassifyf(x) \
! 57: : (sizeof (x) == sizeof (double)) ? \
! 58: __fpclassify(x) \
! 59: : __fpclassifyl(x))
! 60: #define isfinite(x) \
! 61: ((sizeof (x) == sizeof (float)) ? \
! 62: __isfinitef(x) \
! 63: : (sizeof (x) == sizeof (double)) ? \
! 64: __isfinite(x) \
! 65: : __isfinitel(x))
! 66: #define isinf(x) \
! 67: ((sizeof (x) == sizeof (float)) ? \
! 68: isinff(x) \
! 69: : (sizeof (x) == sizeof (double)) ? \
! 70: __isinf(x) \
! 71: : __isinfl(x))
! 72: #define isnan(x) \
! 73: ((sizeof (x) == sizeof (float)) ? \
! 74: isnanf(x) \
! 75: : (sizeof (x) == sizeof (double)) ? \
! 76: __isnan(x) \
! 77: : __isnanl(x))
! 78: #define isnormal(x) \
! 79: ((sizeof (x) == sizeof (float)) ? \
! 80: __isnormalf(x) \
! 81: : (sizeof (x) == sizeof (double)) ? \
! 82: __isnormal(x) \
! 83: : __isnormall(x))
! 84: #define signbit(x) \
! 85: ((sizeof (x) == sizeof (float)) ? \
! 86: __signbitf(x) \
! 87: : (sizeof (x) == sizeof (double)) ? \
! 88: __signbit(x) \
! 89: : __signbitl(x))
! 90:
! 91: #define isgreater(x, y) (!isunordered((x), (y)) && (x) > (y))
! 92: #define isgreaterequal(x, y) (!isunordered((x), (y)) && (x) >= (y))
! 93: #define isless(x, y) (!isunordered((x), (y)) && (x) < (y))
! 94: #define islessequal(x, y) (!isunordered((x), (y)) && (x) <= (y))
! 95: #define islessgreater(x, y) (!isunordered((x), (y)) && \
! 96: ((x) > (y) || (y) > (x)))
! 97: #define isunordered(x, y) (isnan(x) || isnan(y))
! 98: #else /* XXX */
! 99: extern int isinf(double);
! 100: extern int isnan(double);
! 101: #endif /* XXX */
! 102: #endif /* __ISO_C_VISIBLE >= 1999 */
1.1 deraadt 103:
104: /*
105: * XOPEN/SVID
106: */
1.11 millert 107: #if __BSD_VISIBLE || __XPG_VISIBLE
1.1 deraadt 108: #define M_E 2.7182818284590452354 /* e */
109: #define M_LOG2E 1.4426950408889634074 /* log 2e */
110: #define M_LOG10E 0.43429448190325182765 /* log 10e */
111: #define M_LN2 0.69314718055994530942 /* log e2 */
112: #define M_LN10 2.30258509299404568402 /* log e10 */
113: #define M_PI 3.14159265358979323846 /* pi */
114: #define M_PI_2 1.57079632679489661923 /* pi/2 */
115: #define M_PI_4 0.78539816339744830962 /* pi/4 */
116: #define M_1_PI 0.31830988618379067154 /* 1/pi */
117: #define M_2_PI 0.63661977236758134308 /* 2/pi */
118: #define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
119: #define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
120: #define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
121:
1.7 jason 122: #ifdef __vax__
1.18 ! martynas 123: #define MAXFLOAT ((float)1.70141173319264430e+38)
1.7 jason 124: #else
1.1 deraadt 125: #define MAXFLOAT ((float)3.40282346638528860e+38)
1.18 ! martynas 126: #endif /* __vax__ */
1.7 jason 127:
1.1 deraadt 128: extern int signgam;
1.11 millert 129: #endif /* __BSD_VISIBLE || __XPG_VISIBLE */
1.1 deraadt 130:
1.11 millert 131: #if __BSD_VISIBLE
1.1 deraadt 132: enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
133:
134: #define _LIB_VERSION_TYPE enum fdversion
1.18 ! martynas 135: #define _LIB_VERSION _fdlib_version
1.1 deraadt 136:
1.18 ! martynas 137: /* if global variable _LIB_VERSION is not desirable, one may
! 138: * change the following to be a constant by:
1.1 deraadt 139: * #define _LIB_VERSION_TYPE const enum version
140: * In that case, after one initializes the value _LIB_VERSION (see
141: * s_lib_version.c) during compile time, it cannot be modified
142: * in the middle of a program
1.18 ! martynas 143: */
! 144: extern _LIB_VERSION_TYPE _LIB_VERSION;
1.1 deraadt 145:
1.18 ! martynas 146: #define _IEEE_ fdlibm_ieee
! 147: #define _SVID_ fdlibm_svid
! 148: #define _XOPEN_ fdlibm_xopen
! 149: #define _POSIX_ fdlibm_posix
1.1 deraadt 150:
1.5 millert 151: #ifndef __cplusplus
1.1 deraadt 152: struct exception {
153: int type;
154: char *name;
155: double arg1;
156: double arg2;
157: double retval;
158: };
1.18 ! martynas 159: #endif /* !__cplusplus */
1.1 deraadt 160:
161: #define HUGE MAXFLOAT
162:
1.18 ! martynas 163: /*
1.1 deraadt 164: * set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
165: * (one may replace the following line by "#include <values.h>")
166: */
167:
1.18 ! martynas 168: #define X_TLOSS 1.41484755040568800000e+16
1.1 deraadt 169:
170: #define DOMAIN 1
171: #define SING 2
172: #define OVERFLOW 3
173: #define UNDERFLOW 4
174: #define TLOSS 5
175: #define PLOSS 6
176:
1.11 millert 177: #endif /* __BSD_VISIBLE */
1.1 deraadt 178:
179: __BEGIN_DECLS
180: /*
181: * ANSI/POSIX
182: */
1.6 millert 183: extern double acos(double);
184: extern double asin(double);
185: extern double atan(double);
186: extern double atan2(double, double);
187: extern double cos(double);
188: extern double sin(double);
189: extern double tan(double);
190:
191: extern double cosh(double);
192: extern double sinh(double);
193: extern double tanh(double);
194:
195: extern double exp(double);
196: extern double frexp(double, int *);
197: extern double ldexp(double, int);
198: extern double log(double);
199: extern double log10(double);
200: extern double modf(double, double *);
201:
202: extern double pow(double, double);
203: extern double sqrt(double);
204:
205: extern double ceil(double);
206: extern double fabs(double);
207: extern double floor(double);
208: extern double fmod(double, double);
1.1 deraadt 209:
1.18 ! martynas 210: /*
! 211: * C99
! 212: */
! 213: #if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XPG_VISIBLE
! 214: extern double acosh(double);
! 215: extern double asinh(double);
! 216: extern double atanh(double);
! 217:
! 218: #if 0 /* XXX */
! 219: extern double exp2(double);
! 220: #endif /* XXX */
! 221: extern double expm1(double);
! 222: extern int ilogb(double);
! 223: extern double log1p(double);
! 224: #if 0
! 225: extern double log2(double);
! 226: #endif
! 227: extern double logb(double);
! 228: extern double scalbn(double, int);
! 229: #if 0
! 230: extern double scalbln(double, long int);
! 231: #endif
! 232:
! 233: extern double cbrt(double);
! 234: extern double hypot(double, double);
! 235:
! 236: extern double erf(double);
! 237: extern double erfc(double);
! 238: extern double lgamma(double);
! 239: extern double tgamma(double);
! 240:
! 241: #if 0
! 242: extern double nearbyint(double);
! 243: #endif
! 244: extern double rint(double);
! 245: extern long int lrint(double);
! 246: extern long long int llrint(double);
1.14 brad 247: extern double round(double);
1.18 ! martynas 248: extern long int lround(double);
! 249: extern long long int llround(double);
1.13 brad 250: extern double trunc(double);
251:
1.18 ! martynas 252: extern double remainder(double, double);
! 253: #if 0 /* XXX */
! 254: extern double remquo(double, double, int *);
! 255: #endif /* XXX */
! 256:
! 257: extern double copysign(double, double);
! 258: #if 0 /* XXX */
! 259: extern double nan(const char *);
! 260: #endif /* XXX */
! 261: extern double nextafter(double, double);
! 262: #if 0
! 263: extern double nexttoward(double, long double);
! 264: #endif
! 265:
! 266: #if 0
! 267: extern double fdim(double, double);
! 268: extern double fmax(double, double);
! 269: extern double fmin(double, double);
! 270: #endif
! 271:
! 272: #if 0
! 273: extern double fma(double, double, double);
! 274: #endif
! 275: #endif /* __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 || __XPG_VISIBLE */
! 276:
1.11 millert 277: #if __BSD_VISIBLE || __XPG_VISIBLE
1.6 millert 278: extern double j0(double);
279: extern double j1(double);
280: extern double jn(int, double);
1.18 ! martynas 281: extern double scalb(double, double);
1.6 millert 282: extern double y0(double);
283: extern double y1(double);
284: extern double yn(int, double);
1.18 ! martynas 285: #endif /* __BSD_VISIBLE || __XPG_VISIBLE */
1.1 deraadt 286:
1.18 ! martynas 287: #if __BSD_VISIBLE || __XPG_VISIBLE <= 500
! 288: extern double gamma(double);
! 289: #endif /* __BSD_VISIBLE || __XPG_VISIBLE <= 500 */
1.1 deraadt 290:
291: /*
292: * BSD math library entry points
293: */
1.18 ! martynas 294: #if __BSD_VISIBLE
1.6 millert 295: extern double drem(double, double);
1.18 ! martynas 296: extern int finite(double);
1.1 deraadt 297:
298: /*
299: * Reentrant version of gamma & lgamma; passes signgam back by reference
300: * as the second argument; user must allocate space for signgam.
301: */
1.6 millert 302: extern double gamma_r(double, int *);
303: extern double lgamma_r(double, int *);
1.1 deraadt 304:
1.18 ! martynas 305: #ifdef __LIBM_PRIVATE
! 306: extern int matherr(struct exception *);
! 307: #endif /* __LIBM_PRIVATE */
! 308:
! 309: /*
! 310: * IEEE Test Vector
! 311: */
! 312: extern double significand(double);
! 313: #endif /* __BSD_VISIBLE */
1.1 deraadt 314:
1.18 ! martynas 315: /*
! 316: * Float versions of C99 functions
! 317: */
! 318: #if __ISO_C_VISIBLE >= 1999
1.6 millert 319: extern float acosf(float);
320: extern float asinf(float);
321: extern float atanf(float);
322: extern float atan2f(float, float);
323: extern float cosf(float);
324: extern float sinf(float);
325: extern float tanf(float);
326:
1.18 ! martynas 327: extern float acoshf(float);
! 328: extern float asinhf(float);
! 329: extern float atanhf(float);
1.6 millert 330: extern float coshf(float);
331: extern float sinhf(float);
332: extern float tanhf(float);
333:
334: extern float expf(float);
1.18 ! martynas 335: #if 0 /* XXX */
! 336: extern float exp2f(float);
! 337: #endif /* XXX */
! 338: extern float expm1f(float);
1.6 millert 339: extern float frexpf(float, int *);
1.18 ! martynas 340: extern int ilogbf(float);
1.6 millert 341: extern float ldexpf(float, int);
342: extern float logf(float);
343: extern float log10f(float);
1.18 ! martynas 344: extern float log1pf(float);
! 345: #if 0
! 346: extern float log2f(float);
! 347: #endif
! 348: extern float logbf(float);
1.6 millert 349: extern float modff(float, float *);
1.18 ! martynas 350: extern float scalbnf(float, int);
! 351: #if 0
! 352: extern float scalblnf(float, long int);
! 353: #endif
1.6 millert 354:
1.18 ! martynas 355: extern float cbrtf(float);
! 356: extern float fabsf(float);
! 357: extern float hypotf(float, float);
1.6 millert 358: extern float powf(float, float);
359: extern float sqrtf(float);
360:
1.18 ! martynas 361: extern float erff(float);
! 362: extern float erfcf(float);
! 363: extern float lgammaf(float);
! 364: extern float tgammaf(float);
! 365:
1.6 millert 366: extern float ceilf(float);
367: extern float floorf(float);
1.18 ! martynas 368: #if 0
! 369: extern float nearbyintf(float);
! 370: #endif
! 371: extern float rintf(float);
! 372: extern long int lrintf(float);
! 373: extern long long int llrintf(float);
! 374: extern float roundf(float);
! 375: extern long int lroundf(float);
! 376: extern long long int llroundf(float);
! 377: extern float truncf(float);
! 378:
1.6 millert 379: extern float fmodf(float, float);
1.18 ! martynas 380: extern float remainderf(float, float);
! 381: #if 0 /* XXX */
! 382: extern float remquof(float, float, int *);
! 383: #endif /* XXX */
! 384:
! 385: extern float copysignf(float, float);
! 386: #if 0 /* XXX */
! 387: extern float nanf(const char *);
! 388: #endif /* XXX */
! 389: extern float nextafterf(float, float);
! 390: #if 0
! 391: extern float nexttowardf(float, long double);
! 392: #endif
1.13 brad 393:
1.18 ! martynas 394: #if 0
! 395: extern float fdimf(float, float);
! 396: extern float fmaxf(float, float);
! 397: extern float fminf(float, float);
! 398: #endif
! 399:
! 400: #if 0
! 401: extern float fmaf(float, float, float);
! 402: #endif
! 403: #endif /* __ISO_C_VISIBLE >= 1999 */
1.6 millert 404:
1.18 ! martynas 405: #if __BSD_VISIBLE || __XPG_VISIBLE
1.6 millert 406: extern float j0f(float);
407: extern float j1f(float);
408: extern float jnf(int, float);
1.18 ! martynas 409: extern float scalbf(float, float);
1.6 millert 410: extern float y0f(float);
411: extern float y1f(float);
412: extern float ynf(int, float);
1.18 ! martynas 413: #endif /* __BSD_VISIBLE || __XPG_VISIBLE */
1.6 millert 414:
1.18 ! martynas 415: #if __BSD_VISIBLE || __XPG_VISIBLE <= 500
! 416: extern float gammaf(float);
! 417: #endif /* __BSD_VISIBLE || __XPG_VISIBLE <= 500 */
1.1 deraadt 418:
419: /*
1.18 ! martynas 420: * Float versions of BSD math library entry points
1.1 deraadt 421: */
1.18 ! martynas 422: #if __BSD_VISIBLE
! 423: extern float dremf(float, float);
! 424: extern int finitef(float);
! 425: extern int isinff(float);
! 426: extern int isnanf(float);
1.1 deraadt 427:
428: /*
1.18 ! martynas 429: * Float versions of reentrant version of gamma & lgamma; passes
! 430: * signgam back by reference as the second argument; user must
! 431: * allocate space for signgam.
1.1 deraadt 432: */
1.18 ! martynas 433: extern float gammaf_r(float, int *);
! 434: extern float lgammaf_r(float, int *);
1.1 deraadt 435:
436: /*
1.18 ! martynas 437: * Float version of IEEE Test Vector
1.1 deraadt 438: */
1.18 ! martynas 439: extern float significandf(float);
! 440: #endif /* __BSD_VISIBLE */
1.1 deraadt 441:
442: /*
1.18 ! martynas 443: * Long double versions of C99 functions
1.1 deraadt 444: */
1.18 ! martynas 445: #if __ISO_C_VISIBLE >= 1999
! 446: #if 0
! 447: extern long double acosl(long double);
! 448: extern long double asinl(long double);
! 449: extern long double atanl(long double);
! 450: extern long double atan2l(long double, long double);
! 451: extern long double cosl(long double);
! 452: extern long double sinl(long double);
! 453: extern long double tanl(long double);
! 454:
! 455: extern long double acoshl(long double);
! 456: extern long double asinhl(long double);
! 457: extern long double atanhl(long double);
! 458: extern long double coshl(long double);
! 459: extern long double sinhl(long double);
! 460: extern long double tanhl(long double);
! 461:
! 462: extern long double expl(long double);
! 463: extern long double exp2l(long double);
! 464: extern long double expm1l(long double);
! 465: extern long double frexpl(long double, int *);
! 466: extern int ilogbl(long double);
! 467: extern long double ldexpl(long double, int);
! 468: extern long double logl(long double);
! 469: extern long double log10l(long double);
! 470: extern long double log1pl(long double);
! 471: extern long double log2l(long double);
! 472: extern long double logbl(long double);
! 473: extern long double modfl(long double, long double *);
! 474: extern long double scalbnl(long double, int);
! 475: extern long double scalblnl(long double, long int);
! 476:
! 477: extern long double cbrtl(long double);
! 478: extern long double fabsl(long double);
! 479: extern long double hypotl(long double, long double);
! 480: extern long double powl(long double, long double);
! 481: extern long double sqrtl(long double);
! 482:
! 483: extern long double erfl(long double);
! 484: extern long double erfcl(long double);
! 485: extern long double lgammal(long double);
! 486: extern long double tgammal(long double);
! 487:
! 488: extern long double ceill(long double);
! 489: extern long double floorl(long double);
! 490: extern long double nearbyintl(long double);
! 491: extern long double rintl(long double);
! 492: extern long int lrintl(long double);
! 493: extern long long int llrintl(long double);
! 494: extern long double roundl(long double);
! 495: extern long int lroundl(long double);
! 496: extern long long int llroundl(long double);
! 497: extern long double truncl(long double);
! 498:
! 499: extern long double fmodl(long double, long double);
! 500: extern long double remainderl(long double, long double);
! 501: extern long double remquol(long double, long double, int *);
! 502:
! 503: extern long double copysignl(long double, long double);
! 504: extern long double nanl(const char *);
! 505: extern long double nextafterl(long double, long double);
! 506: extern long double nexttowardl(long double, long double);
! 507:
! 508: extern long double fdiml(long double, long double);
! 509: extern long double fmaxl(long double, long double);
! 510: extern long double fminl(long double, long double);
! 511:
! 512: extern long double fmal(long double, long double, long double);
! 513: #endif
! 514: #endif /* __ISO_C_VISIBLE >= 1999 */
1.1 deraadt 515:
1.18 ! martynas 516: /*
! 517: * Library implementation
! 518: */
! 519: #if 0 /* XXX */
! 520: extern int __fpclassify(double);
! 521: extern int __fpclassifyf(float);
! 522: extern int __fpclassifyl(long double);
! 523: extern int __isfinite(double);
! 524: extern int __isfinitef(float);
! 525: extern int __isfinitel(long double);
! 526: extern int __isinf(double);
! 527: extern int __isinfl(long double);
! 528: extern int __isnan(double);
! 529: extern int __isnanl(long double);
! 530: extern int __isnormal(double);
! 531: extern int __isnormalf(float);
! 532: extern int __isnormall(long double);
! 533: extern int __signbit(double);
! 534: extern int __signbitf(float);
! 535: extern int __signbitl(long double);
! 536: #endif /* XXX */
1.16 martynas 537:
538: #if __BSD_VISIBLE && defined(__vax__)
539: extern double infnan(int);
540: #endif /* __BSD_VISIBLE && defined(__vax__) */
1.1 deraadt 541: __END_DECLS
542:
1.18 ! martynas 543: #endif /* !_MATH_H_ */