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 */