Piotr Jasiukajtis | 25c28e83 | 2014-02-04 20:31:57 +0100 | [diff] [blame] | 1 | /* |
| 2 | * CDDL HEADER START |
| 3 | * |
| 4 | * The contents of this file are subject to the terms of the |
| 5 | * Common Development and Distribution License (the "License"). |
| 6 | * You may not use this file except in compliance with the License. |
| 7 | * |
| 8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| 9 | * or http://www.opensolaris.org/os/licensing. |
| 10 | * See the License for the specific language governing permissions |
| 11 | * and limitations under the License. |
| 12 | * |
| 13 | * When distributing Covered Code, include this CDDL HEADER in each |
| 14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| 15 | * If applicable, add the following below this CDDL HEADER, with the |
| 16 | * fields enclosed by brackets "[]" replaced with your own identifying |
| 17 | * information: Portions Copyright [yyyy] [name of copyright owner] |
| 18 | * |
| 19 | * CDDL HEADER END |
| 20 | */ |
| 21 | /* |
| 22 | * Copyright 2011 Nexenta Systems, Inc. All rights reserved. |
| 23 | */ |
| 24 | /* |
| 25 | * Copyright 2004 Sun Microsystems, Inc. All rights reserved. |
| 26 | * Use is subject to license terms. |
| 27 | */ |
| 28 | |
| 29 | #ifndef _MATH_H |
| 30 | #define _MATH_H |
| 31 | |
| 32 | #include <iso/math_iso.h> |
| 33 | #include <iso/math_c99.h> |
| 34 | |
| 35 | #if __cplusplus >= 199711L |
| 36 | using std::abs; |
| 37 | using std::acos; |
| 38 | using std::asin; |
| 39 | using std::atan2; |
| 40 | using std::atan; |
| 41 | using std::ceil; |
| 42 | using std::cos; |
| 43 | using std::cosh; |
| 44 | using std::exp; |
| 45 | using std::fabs; |
| 46 | using std::floor; |
| 47 | using std::fmod; |
| 48 | using std::frexp; |
| 49 | using std::ldexp; |
| 50 | using std::log10; |
| 51 | using std::log; |
| 52 | using std::modf; |
| 53 | using std::pow; |
| 54 | using std::sin; |
| 55 | using std::sinh; |
| 56 | using std::sqrt; |
| 57 | using std::tan; |
| 58 | using std::tanh; |
| 59 | #endif |
| 60 | |
| 61 | #ifdef __cplusplus |
| 62 | extern "C" { |
| 63 | #endif |
| 64 | |
| 65 | #if defined(__cplusplus) |
| 66 | #define exception __math_exception |
| 67 | #endif |
| 68 | |
| 69 | #ifndef __P |
| 70 | #ifdef __STDC__ |
| 71 | #define __P(p) p |
| 72 | #else |
| 73 | #define __P(p) () |
| 74 | #endif |
| 75 | #endif /* !defined(__P) */ |
| 76 | |
| 77 | #if defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE) || \ |
| 78 | !defined(_STRICT_STDC) && !defined(_POSIX_C_SOURCE) |
| 79 | /* |
| 80 | * SVID & X/Open |
| 81 | */ |
| 82 | #define M_E 2.7182818284590452354 |
| 83 | #define M_LOG2E 1.4426950408889634074 |
| 84 | #define M_LOG10E 0.43429448190325182765 |
| 85 | #define M_LN2 0.69314718055994530942 |
| 86 | #define M_LN10 2.30258509299404568402 |
| 87 | #define M_PI 3.14159265358979323846 |
| 88 | #define M_PI_2 1.57079632679489661923 |
| 89 | #define M_PI_4 0.78539816339744830962 |
| 90 | #define M_1_PI 0.31830988618379067154 |
| 91 | #define M_2_PI 0.63661977236758134308 |
| 92 | #define M_2_SQRTPI 1.12837916709551257390 |
| 93 | #define M_SQRT2 1.41421356237309504880 |
| 94 | #define M_SQRT1_2 0.70710678118654752440 |
| 95 | |
| 96 | extern int signgam; |
| 97 | |
| 98 | #define MAXFLOAT ((float)3.40282346638528860e+38) |
| 99 | |
| 100 | #if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) |
| 101 | /* |
| 102 | * SVID |
| 103 | */ |
| 104 | enum version {libm_ieee = -1, c_issue_4, ansi_1, strict_ansi}; |
| 105 | |
| 106 | #ifdef __STDC__ |
| 107 | extern const enum version _lib_version; |
| 108 | #else |
| 109 | extern enum version _lib_version; |
| 110 | #endif |
| 111 | |
| 112 | struct exception { |
| 113 | int type; |
| 114 | char *name; |
| 115 | double arg1; |
| 116 | double arg2; |
| 117 | double retval; |
| 118 | }; |
| 119 | |
| 120 | #define HUGE MAXFLOAT |
| 121 | |
| 122 | #define _ABS(x) ((x) < 0 ? -(x) : (x)) |
| 123 | |
| 124 | #define _REDUCE(TYPE, X, XN, C1, C2) { \ |
| 125 | double x1 = (double)(TYPE)X, x2 = X - x1; \ |
| 126 | X = x1 - (XN) * (C1); X += x2; X -= (XN) * (C2); } |
| 127 | |
| 128 | #define DOMAIN 1 |
| 129 | #define SING 2 |
| 130 | #define OVERFLOW 3 |
| 131 | #define UNDERFLOW 4 |
| 132 | #define TLOSS 5 |
| 133 | #define PLOSS 6 |
| 134 | |
| 135 | #define _POLY1(x, c) ((c)[0] * (x) + (c)[1]) |
| 136 | #define _POLY2(x, c) (_POLY1((x), (c)) * (x) + (c)[2]) |
| 137 | #define _POLY3(x, c) (_POLY2((x), (c)) * (x) + (c)[3]) |
| 138 | #define _POLY4(x, c) (_POLY3((x), (c)) * (x) + (c)[4]) |
| 139 | #define _POLY5(x, c) (_POLY4((x), (c)) * (x) + (c)[5]) |
| 140 | #define _POLY6(x, c) (_POLY5((x), (c)) * (x) + (c)[6]) |
| 141 | #define _POLY7(x, c) (_POLY6((x), (c)) * (x) + (c)[7]) |
| 142 | #define _POLY8(x, c) (_POLY7((x), (c)) * (x) + (c)[8]) |
| 143 | #define _POLY9(x, c) (_POLY8((x), (c)) * (x) + (c)[9]) |
| 144 | #endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) */ |
| 145 | |
| 146 | /* |
| 147 | * SVID & X/Open |
| 148 | */ |
| 149 | /* BEGIN adopted by C99 */ |
| 150 | extern double erf __P((double)); |
| 151 | extern double erfc __P((double)); |
| 152 | extern double hypot __P((double, double)); |
| 153 | extern double lgamma __P((double)); |
| 154 | |
| 155 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 156 | #pragma does_not_read_global_data(erf, erfc, hypot) |
| 157 | #pragma does_not_write_global_data(erf, erfc, hypot) |
| 158 | #pragma no_side_effect(erf, erfc, hypot) |
| 159 | #endif |
| 160 | |
| 161 | #if !defined(_STDC_C99) && _XOPEN_SOURCE - 0 < 600 && !defined(__C99FEATURES__) |
| 162 | extern int isnan __P((double)); |
| 163 | |
| 164 | #pragma does_not_read_global_data(isnan) |
| 165 | #pragma does_not_write_global_data(isnan) |
| 166 | #pragma no_side_effect(isnan) |
| 167 | #endif |
| 168 | /* END adopted by C99 */ |
| 169 | |
| 170 | #if defined(__EXTENSIONS__) || _XOPEN_SOURCE - 0 < 600 |
| 171 | extern double gamma __P((double)); /* deprecated; use lgamma */ |
| 172 | #endif |
| 173 | extern double j0 __P((double)); |
| 174 | extern double j1 __P((double)); |
| 175 | extern double jn __P((int, double)); |
| 176 | extern double y0 __P((double)); |
| 177 | extern double y1 __P((double)); |
| 178 | extern double yn __P((int, double)); |
| 179 | |
| 180 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 181 | #pragma does_not_read_global_data(j0, j1, jn, y0, y1, yn) |
| 182 | #pragma does_not_write_global_data(j0, j1, jn, y0, y1, yn) |
| 183 | #pragma no_side_effect(j0, j1, jn, y0, y1, yn) |
| 184 | #endif |
| 185 | #if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) || \ |
| 186 | _XOPEN_SOURCE - 0 >= 500 || \ |
| 187 | defined(_XOPEN_SOURCE) && _XOPEN_SOURCE_EXTENDED - 0 == 1 |
| 188 | /* |
| 189 | * SVID & XPG 4.2/5 |
| 190 | */ |
| 191 | extern double scalb __P((double, double)); |
| 192 | |
| 193 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 194 | #pragma does_not_read_global_data(scalb) |
| 195 | #pragma does_not_write_global_data(scalb) |
| 196 | #pragma no_side_effect(scalb) |
| 197 | #endif |
| 198 | |
| 199 | /* BEGIN adopted by C99 */ |
| 200 | extern double acosh __P((double)); |
| 201 | extern double asinh __P((double)); |
| 202 | extern double atanh __P((double)); |
| 203 | extern double cbrt __P((double)); |
| 204 | extern double logb __P((double)); |
| 205 | extern double nextafter __P((double, double)); |
| 206 | extern double remainder __P((double, double)); |
| 207 | |
| 208 | /* |
| 209 | * XPG 4.2/5 |
| 210 | */ |
| 211 | extern double expm1 __P((double)); |
| 212 | extern int ilogb __P((double)); |
| 213 | extern double log1p __P((double)); |
| 214 | extern double rint __P((double)); |
| 215 | |
| 216 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 217 | #pragma does_not_read_global_data(acosh, asinh, atanh, cbrt) |
| 218 | #pragma does_not_read_global_data(logb, nextafter, remainder) |
| 219 | #pragma does_not_read_global_data(expm1, ilogb, log1p, rint) |
| 220 | #pragma does_not_write_global_data(acosh, asinh, atanh, cbrt) |
| 221 | #pragma does_not_write_global_data(logb, nextafter, remainder) |
| 222 | #pragma does_not_write_global_data(expm1, ilogb, log1p, rint) |
| 223 | #pragma no_side_effect(acosh, asinh, atanh, cbrt) |
| 224 | #pragma no_side_effect(logb, nextafter, remainder) |
| 225 | #pragma no_side_effect(expm1, ilogb, log1p, rint) |
| 226 | #endif |
| 227 | /* END adopted by C99 */ |
| 228 | #endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) || ... */ |
| 229 | |
| 230 | #if defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) |
| 231 | /* |
| 232 | * SVID |
| 233 | */ |
| 234 | extern int matherr __P((struct exception *)); |
| 235 | |
| 236 | /* |
| 237 | * IEEE Test Vector |
| 238 | */ |
| 239 | extern double significand __P((double)); |
| 240 | |
| 241 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 242 | #pragma does_not_read_global_data(significand) |
| 243 | #pragma does_not_write_global_data(significand) |
| 244 | #pragma no_side_effect(significand) |
| 245 | #endif |
| 246 | |
| 247 | extern int signgamf; /* deprecated; use signgam */ |
| 248 | extern int signgaml; /* deprecated; use signgam */ |
| 249 | |
| 250 | extern int isnanf __P((float)); |
| 251 | extern int isnanl __P((long double)); |
| 252 | extern float gammaf __P((float)); /* deprecated; use lgammaf */ |
| 253 | extern float gammaf_r __P((float, int *)); /* deprecated; use lgammaf_r */ |
| 254 | extern float j0f __P((float)); |
| 255 | extern float j1f __P((float)); |
| 256 | extern float jnf __P((int, float)); |
| 257 | extern float lgammaf_r __P((float, int *)); |
| 258 | extern float scalbf __P((float, float)); |
| 259 | extern float significandf __P((float)); |
| 260 | extern float y0f __P((float)); |
| 261 | extern float y1f __P((float)); |
| 262 | extern float ynf __P((int, float)); |
| 263 | extern long double gammal __P((long double)); /* deprecated; use lgammal */ |
| 264 | extern long double gammal_r __P((long double, int *)); /* deprecated */ |
| 265 | extern long double j0l __P((long double)); |
| 266 | extern long double j1l __P((long double)); |
| 267 | extern long double jnl __P((int, long double)); |
| 268 | extern long double lgammal_r __P((long double, int *)); |
| 269 | extern long double scalbl __P((long double, long double)); |
| 270 | extern long double significandl __P((long double)); |
| 271 | extern long double y0l __P((long double)); |
| 272 | extern long double y1l __P((long double)); |
| 273 | extern long double ynl __P((int, long double)); |
| 274 | |
| 275 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 276 | #pragma does_not_read_global_data(isnanf, isnanl) |
| 277 | #pragma does_not_write_global_data(isnanf, isnanl) |
| 278 | #pragma no_side_effect(isnanf, isnanl) |
| 279 | #pragma does_not_read_global_data(gammaf_r, j0f, j1f, jnf, lgammaf_r, scalbf) |
| 280 | #pragma does_not_read_global_data(significandf, y0f, y1f, ynf) |
| 281 | #pragma does_not_write_global_data(j0f, j1f, jnf, scalbf) |
| 282 | #pragma does_not_write_global_data(significandf, y0f, y1f, ynf) |
| 283 | #pragma no_side_effect(j0f, j1f, jnf, scalbf) |
| 284 | #pragma no_side_effect(significandf, y0f, y1f, ynf) |
| 285 | #pragma does_not_read_global_data(gammal_r, j0l, j1l, jnl, lgammal_r, scalbl) |
| 286 | #pragma does_not_read_global_data(significandl, y0l, y1l, ynl) |
| 287 | #pragma does_not_write_global_data(j0l, j1l, jnl, scalbl) |
| 288 | #pragma does_not_write_global_data(significandl, y0l, y1l, ynl) |
| 289 | #pragma no_side_effect(j0l, j1l, jnl, scalbl) |
| 290 | #pragma no_side_effect(significandl, y0l, y1l, ynl) |
| 291 | #endif |
| 292 | |
| 293 | /* |
| 294 | * for sin+cos->sincos transformation |
| 295 | */ |
| 296 | extern void sincos __P((double, double *, double *)); |
| 297 | extern void sincosf __P((float, float *, float *)); |
| 298 | extern void sincosl __P((long double, long double *, long double *)); |
| 299 | |
| 300 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 301 | #pragma does_not_read_global_data(sincos, sincosf, sincosl) |
| 302 | #endif |
| 303 | |
| 304 | /* BEGIN adopted by C99 */ |
| 305 | /* |
| 306 | * Functions callable from C, intended to support IEEE arithmetic. |
| 307 | */ |
| 308 | extern double copysign __P((double, double)); |
| 309 | extern double scalbn __P((double, int)); |
| 310 | |
| 311 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 312 | #pragma does_not_read_global_data(copysign, scalbn) |
| 313 | #pragma does_not_write_global_data(copysign, scalbn) |
| 314 | #pragma no_side_effect(copysign, scalbn) |
| 315 | #endif |
| 316 | /* END adopted by C99 */ |
| 317 | |
| 318 | /* |
| 319 | * Reentrant version of gamma & lgamma; passes signgam back by reference |
| 320 | * as the second argument; user must allocate space for signgam. |
| 321 | */ |
| 322 | extern double gamma_r __P((double, int *)); /* deprecated; use lgamma_r */ |
| 323 | extern double lgamma_r __P((double, int *)); |
| 324 | |
| 325 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 326 | #pragma does_not_read_global_data(gamma_r, lgamma_r) |
| 327 | #endif |
| 328 | |
| 329 | /* BEGIN adopted by C99 */ |
| 330 | extern float modff __P((float, float *)); |
| 331 | |
| 332 | #if defined(__MATHERR_ERRNO_DONTCARE) |
| 333 | #pragma does_not_read_global_data(modff) |
| 334 | #endif |
| 335 | /* END adopted by C99 */ |
| 336 | |
| 337 | #if defined(__EXTENSIONS__) || !defined(__cplusplus) |
| 338 | #include <floatingpoint.h> |
| 339 | #endif |
| 340 | #endif /* defined(__EXTENSIONS__) || !defined(_XOPEN_SOURCE) */ |
| 341 | #endif /* defined(__EXTENSIONS__) || defined(_XOPEN_SOURCE) || ... */ |
| 342 | |
| 343 | #if defined(__cplusplus) && defined(__GNUC__) |
| 344 | #undef exception |
| 345 | #endif |
| 346 | |
| 347 | #ifdef __cplusplus |
| 348 | } |
| 349 | #endif |
| 350 | |
| 351 | #endif /* _MATH_H */ |