1#ifndef _MATH_H_ 2 3#define _MATH_H_ 4 5 /* Indicate that we honor AEABI portability if requested. */ 6#if defined _AEABI_PORTABILITY_LEVEL && _AEABI_PORTABILITY_LEVEL != 0 && !defined _AEABI_PORTABLE 7# define _AEABI_PORTABLE 8#endif 9 10#include <sys/reent.h> 11#include <machine/ieeefp.h> 12#include "_ansi.h" 13 14_BEGIN_STD_C 15 16/* __dmath, __fmath, and __ldmath are only here for backwards compatibility 17 * in case any code used them. They are no longer used by Newlib, itself, 18 * other than legacy. */ 19union __dmath 20{ 21 double d; 22 __ULong i[2]; 23}; 24 25union __fmath 26{ 27 float f; 28 __ULong i[1]; 29}; 30 31#if defined(_HAVE_LONG_DOUBLE) 32union __ldmath 33{ 34 long double ld; 35 __ULong i[4]; 36}; 37#endif 38 39/* Natural log of 2 */ 40#define _M_LN2 0.693147180559945309417 41 42#if __GNUC_PREREQ (3, 3) 43 /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values. */ 44 45# ifndef HUGE_VAL 46# define HUGE_VAL (__builtin_huge_val()) 47# endif 48 49# ifndef HUGE_VALF 50# define HUGE_VALF (__builtin_huge_valf()) 51# endif 52 53# ifndef HUGE_VALL 54# define HUGE_VALL (__builtin_huge_vall()) 55# endif 56 57# ifndef INFINITY 58# define INFINITY (__builtin_inff()) 59# endif 60 61# ifndef NAN 62# define NAN (__builtin_nanf("")) 63# endif 64 65#else /* !gcc >= 3.3 */ 66 67 /* No builtins. Use fixed defines instead. (All 3 HUGE plus the INFINITY 68 * and NAN macros are required to be constant expressions. Using a variable-- 69 * even a static const--does not meet this requirement, as it cannot be 70 * evaluated at translation time.) 71 * The infinities are done using numbers that are far in excess of 72 * something that would be expected to be encountered in a floating-point 73 * implementation. (A more certain way uses values from float.h, but that is 74 * avoided because system includes are not supposed to include each other.) 75 * This method might produce warnings from some compilers. (It does in 76 * newer GCCs, but not for ones that would hit this #else.) If this happens, 77 * please report details to the Newlib mailing list. */ 78 79 #ifndef HUGE_VAL 80 #define HUGE_VAL (1.0e999999999) 81 #endif 82 83 #ifndef HUGE_VALF 84 #define HUGE_VALF (1.0e999999999F) 85 #endif 86 87 #if !defined(HUGE_VALL) && defined(_HAVE_LONG_DOUBLE) 88 #define HUGE_VALL (1.0e999999999L) 89 #endif 90 91 #if !defined(INFINITY) 92 #define INFINITY (HUGE_VALF) 93 #endif 94 95 #if !defined(NAN) 96 #if defined(__GNUC__) && defined(__cplusplus) 97 /* Exception: older g++ versions warn about the divide by 0 used in the 98 * normal case (even though older gccs do not). This trick suppresses the 99 * warning, but causes errors for plain gcc, so is only used in the one 100 * special case. */ 101 static const union { __ULong __i[1]; float __d; } __Nanf = {0x7FC00000}; 102 #define NAN (__Nanf.__d) 103 #else 104 #define NAN (0.0F/0.0F) 105 #endif 106 #endif 107 108#endif /* !gcc >= 3.3 */ 109 110/* Reentrant ANSI C functions. */ 111 112#ifndef __math_68881 113extern double atan _PARAMS((double)); 114extern double cos _PARAMS((double)); 115extern double sin _PARAMS((double)); 116extern double tan _PARAMS((double)); 117extern double tanh _PARAMS((double)); 118extern double frexp _PARAMS((double, int *)); 119extern double modf _PARAMS((double, double *)); 120extern double ceil _PARAMS((double)); 121extern double fabs _PARAMS((double)); 122extern double floor _PARAMS((double)); 123#endif /* ! defined (__math_68881) */ 124 125/* Non reentrant ANSI C functions. */ 126 127#ifndef _REENT_ONLY 128#ifndef __math_68881 129extern double acos _PARAMS((double)); 130extern double asin _PARAMS((double)); 131extern double atan2 _PARAMS((double, double)); 132extern double cosh _PARAMS((double)); 133extern double sinh _PARAMS((double)); 134extern double exp _PARAMS((double)); 135extern double ldexp _PARAMS((double, int)); 136extern double log _PARAMS((double)); 137extern double log10 _PARAMS((double)); 138extern double pow _PARAMS((double, double)); 139extern double sqrt _PARAMS((double)); 140extern double fmod _PARAMS((double, double)); 141#endif /* ! defined (__math_68881) */ 142#endif /* ! defined (_REENT_ONLY) */ 143 144#if !defined(__STRICT_ANSI__) || defined(__cplusplus) || __STDC_VERSION__ >= 199901L 145 146/* ISO C99 types and macros. */ 147 148/* FIXME: FLT_EVAL_METHOD should somehow be gotten from float.h (which is hard, 149 * considering that the standard says the includes it defines should not 150 * include other includes that it defines) and that value used. (This can be 151 * solved, but autoconf has a bug which makes the solution more difficult, so 152 * it has been skipped for now.) */ 153#if !defined(FLT_EVAL_METHOD) && defined(__FLT_EVAL_METHOD__) 154 #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ 155 #define __TMP_FLT_EVAL_METHOD 156#endif /* FLT_EVAL_METHOD */ 157#if defined FLT_EVAL_METHOD 158 #if FLT_EVAL_METHOD == 0 159 typedef float float_t; 160 typedef double double_t; 161 #elif FLT_EVAL_METHOD == 1 162 typedef double float_t; 163 typedef double double_t; 164 #elif FLT_EVAL_METHOD == 2 165 typedef long double float_t; 166 typedef long double double_t; 167 #else 168 /* Implementation-defined. Assume float_t and double_t have been 169 * defined previously for this configuration (e.g. config.h). */ 170 #endif 171#else 172 /* Assume basic definitions. */ 173 typedef float float_t; 174 typedef double double_t; 175#endif 176#if defined(__TMP_FLT_EVAL_METHOD) 177 #undef FLT_EVAL_METHOD 178#endif 179 180#define FP_NAN 0 181#define FP_INFINITE 1 182#define FP_ZERO 2 183#define FP_SUBNORMAL 3 184#define FP_NORMAL 4 185 186#ifndef FP_ILOGB0 187# define FP_ILOGB0 (-INT_MAX) 188#endif 189#ifndef FP_ILOGBNAN 190# define FP_ILOGBNAN INT_MAX 191#endif 192 193#ifndef MATH_ERRNO 194# define MATH_ERRNO 1 195#endif 196#ifndef MATH_ERREXCEPT 197# define MATH_ERREXCEPT 2 198#endif 199#ifndef math_errhandling 200# define math_errhandling MATH_ERRNO 201#endif 202 203extern int __isinff (float x); 204extern int __isinfd (double x); 205extern int __isnanf (float x); 206extern int __isnand (double x); 207extern int __fpclassifyf (float x); 208extern int __fpclassifyd (double x); 209extern int __signbitf (float x); 210extern int __signbitd (double x); 211 212#define fpclassify(__x) \ 213 ((sizeof(__x) == sizeof(float)) ? __fpclassifyf(__x) : \ 214 __fpclassifyd(__x)) 215 216#ifndef isfinite 217 #define isfinite(__y) \ 218 (__extension__ ({int __cy = fpclassify(__y); \ 219 __cy != FP_INFINITE && __cy != FP_NAN;})) 220#endif 221 222/* Note: isinf and isnan were once functions in newlib that took double 223 * arguments. C99 specifies that these names are reserved for macros 224 * supporting multiple floating point types. Thus, they are 225 * now defined as macros. Implementations of the old functions 226 * taking double arguments still exist for compatibility purposes 227 * (prototypes for them are in <ieeefp.h>). */ 228#ifndef isinf 229 #define isinf(y) (fpclassify(y) == FP_INFINITE) 230#endif 231 232#ifndef isnan 233 #define isnan(y) (fpclassify(y) == FP_NAN) 234#endif 235 236#define isnormal(y) (fpclassify(y) == FP_NORMAL) 237#define signbit(__x) \ 238 ((sizeof(__x) == sizeof(float)) ? __signbitf(__x) : \ 239 __signbitd(__x)) 240 241#define isgreater(x,y) \ 242 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 243 !isunordered(__x,__y) && (__x > __y);})) 244#define isgreaterequal(x,y) \ 245 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 246 !isunordered(__x,__y) && (__x >= __y);})) 247#define isless(x,y) \ 248 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 249 !isunordered(__x,__y) && (__x < __y);})) 250#define islessequal(x,y) \ 251 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 252 !isunordered(__x,__y) && (__x <= __y);})) 253#define islessgreater(x,y) \ 254 (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ 255 !isunordered(__x,__y) && (__x < __y || __x > __y);})) 256 257#define isunordered(a,b) \ 258 (__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \ 259 fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;})) 260 261/* Non ANSI double precision functions. */ 262 263extern double infinity _PARAMS((void)); 264extern double nan _PARAMS((const char *)); 265extern int finite _PARAMS((double)); 266extern double copysign _PARAMS((double, double)); 267extern double logb _PARAMS((double)); 268extern int ilogb _PARAMS((double)); 269 270extern double asinh _PARAMS((double)); 271extern double cbrt _PARAMS((double)); 272extern double nextafter _PARAMS((double, double)); 273extern double rint _PARAMS((double)); 274extern double scalbn _PARAMS((double, int)); 275 276extern double exp2 _PARAMS((double)); 277extern double scalbln _PARAMS((double, long int)); 278extern double tgamma _PARAMS((double)); 279extern double nearbyint _PARAMS((double)); 280extern long int lrint _PARAMS((double)); 281extern _LONG_LONG_TYPE int llrint _PARAMS((double)); 282extern double round _PARAMS((double)); 283extern long int lround _PARAMS((double)); 284extern long long int llround _PARAMS((double)); 285extern double trunc _PARAMS((double)); 286extern double remquo _PARAMS((double, double, int *)); 287extern double fdim _PARAMS((double, double)); 288extern double fmax _PARAMS((double, double)); 289extern double fmin _PARAMS((double, double)); 290extern double fma _PARAMS((double, double, double)); 291 292#ifndef __math_68881 293extern double log1p _PARAMS((double)); 294extern double expm1 _PARAMS((double)); 295#endif /* ! defined (__math_68881) */ 296 297#ifndef _REENT_ONLY 298extern double acosh _PARAMS((double)); 299extern double atanh _PARAMS((double)); 300extern double remainder _PARAMS((double, double)); 301extern double gamma _PARAMS((double)); 302extern double lgamma _PARAMS((double)); 303extern double erf _PARAMS((double)); 304extern double erfc _PARAMS((double)); 305extern double log2 _PARAMS((double)); 306#if !defined(__cplusplus) 307#define log2(x) (log (x) / _M_LN2) 308#endif 309 310#ifndef __math_68881 311extern double hypot _PARAMS((double, double)); 312#endif 313 314#endif /* ! defined (_REENT_ONLY) */ 315 316/* Single precision versions of ANSI functions. */ 317 318extern float atanf _PARAMS((float)); 319extern float cosf _PARAMS((float)); 320extern float sinf _PARAMS((float)); 321extern float tanf _PARAMS((float)); 322extern float tanhf _PARAMS((float)); 323extern float frexpf _PARAMS((float, int *)); 324extern float modff _PARAMS((float, float *)); 325extern float ceilf _PARAMS((float)); 326extern float fabsf _PARAMS((float)); 327extern float floorf _PARAMS((float)); 328 329#ifndef _REENT_ONLY 330extern float acosf _PARAMS((float)); 331extern float asinf _PARAMS((float)); 332extern float atan2f _PARAMS((float, float)); 333extern float coshf _PARAMS((float)); 334extern float sinhf _PARAMS((float)); 335extern float expf _PARAMS((float)); 336extern float ldexpf _PARAMS((float, int)); 337extern float logf _PARAMS((float)); 338extern float log10f _PARAMS((float)); 339extern float powf _PARAMS((float, float)); 340extern float sqrtf _PARAMS((float)); 341extern float fmodf _PARAMS((float, float)); 342#endif /* ! defined (_REENT_ONLY) */ 343 344/* Other single precision functions. */ 345 346extern float exp2f _PARAMS((float)); 347extern float scalblnf _PARAMS((float, long int)); 348extern float tgammaf _PARAMS((float)); 349extern float nearbyintf _PARAMS((float)); 350extern long int lrintf _PARAMS((float)); 351extern _LONG_LONG_TYPE llrintf _PARAMS((float)); 352extern float roundf _PARAMS((float)); 353extern long int lroundf _PARAMS((float)); 354extern long long int llroundf _PARAMS((float)); 355extern float truncf _PARAMS((float)); 356extern float remquof _PARAMS((float, float, int *)); 357extern float fdimf _PARAMS((float, float)); 358extern float fmaxf _PARAMS((float, float)); 359extern float fminf _PARAMS((float, float)); 360extern float fmaf _PARAMS((float, float, float)); 361 362extern float infinityf _PARAMS((void)); 363extern float nanf _PARAMS((const char *)); 364extern int finitef _PARAMS((float)); 365extern float copysignf _PARAMS((float, float)); 366extern float logbf _PARAMS((float)); 367extern int ilogbf _PARAMS((float)); 368 369extern float asinhf _PARAMS((float)); 370extern float cbrtf _PARAMS((float)); 371extern float nextafterf _PARAMS((float, float)); 372extern float rintf _PARAMS((float)); 373extern float scalbnf _PARAMS((float, int)); 374extern float log1pf _PARAMS((float)); 375extern float expm1f _PARAMS((float)); 376 377#ifndef _REENT_ONLY 378extern float acoshf _PARAMS((float)); 379extern float atanhf _PARAMS((float)); 380extern float remainderf _PARAMS((float, float)); 381extern float gammaf _PARAMS((float)); 382extern float lgammaf _PARAMS((float)); 383extern float erff _PARAMS((float)); 384extern float erfcf _PARAMS((float)); 385extern float log2f _PARAMS((float)); 386extern float hypotf _PARAMS((float, float)); 387#endif /* ! defined (_REENT_ONLY) */ 388 389/* On platforms where long double equals double. */ 390#ifdef _LDBL_EQ_DBL 391/* Reentrant ANSI C functions. */ 392#ifndef __math_68881 393extern long double atanl _PARAMS((long double)); 394extern long double cosl _PARAMS((long double)); 395extern long double sinl _PARAMS((long double)); 396extern long double tanl _PARAMS((long double)); 397extern long double tanhl _PARAMS((long double)); 398extern long double frexpl _PARAMS((long double, int *)); 399extern long double modfl _PARAMS((long double, long double *)); 400extern long double ceill _PARAMS((long double)); 401extern long double fabsl _PARAMS((long double)); 402extern long double floorl _PARAMS((long double)); 403extern long double log1pl _PARAMS((long double)); 404extern long double expm1l _PARAMS((long double)); 405#endif /* ! defined (__math_68881) */ 406/* Non reentrant ANSI C functions. */ 407#ifndef _REENT_ONLY 408#ifndef __math_68881 409extern long double acosl _PARAMS((long double)); 410extern long double asinl _PARAMS((long double)); 411extern long double atan2l _PARAMS((long double, long double)); 412extern long double coshl _PARAMS((long double)); 413extern long double sinhl _PARAMS((long double)); 414extern long double expl _PARAMS((long double)); 415extern long double ldexpl _PARAMS((long double, int)); 416extern long double logl _PARAMS((long double)); 417extern long double log10l _PARAMS((long double)); 418extern long double powl _PARAMS((long double, long double)); 419extern long double sqrtl _PARAMS((long double)); 420extern long double fmodl _PARAMS((long double, long double)); 421extern long double hypotl _PARAMS((long double, long double)); 422#endif /* ! defined (__math_68881) */ 423#endif /* ! defined (_REENT_ONLY) */ 424extern long double copysignl _PARAMS((long double, long double)); 425extern long double nanl _PARAMS((const char *)); 426extern int ilogbl _PARAMS((long double)); 427extern long double asinhl _PARAMS((long double)); 428extern long double cbrtl _PARAMS((long double)); 429extern long double nextafterl _PARAMS((long double, long double)); 430extern long double rintl _PARAMS((long double)); 431extern long double scalbnl _PARAMS((long double, int)); 432extern long double exp2l _PARAMS((long double)); 433extern long double scalblnl _PARAMS((long double, long)); 434extern long double tgammal _PARAMS((long double)); 435extern long double nearbyintl _PARAMS((long double)); 436extern long int lrintl _PARAMS((long double)); 437extern long long int llrintl _PARAMS((long double)); 438extern long double roundl _PARAMS((long double)); 439extern long lroundl _PARAMS((long double)); 440extern _LONG_LONG_TYPE int llroundl _PARAMS((long double)); 441extern long double truncl _PARAMS((long double)); 442extern long double remquol _PARAMS((long double, long double, int *)); 443extern long double fdiml _PARAMS((long double, long double)); 444extern long double fmaxl _PARAMS((long double, long double)); 445extern long double fminl _PARAMS((long double, long double)); 446extern long double fmal _PARAMS((long double, long double, long double)); 447#ifndef _REENT_ONLY 448extern long double acoshl _PARAMS((long double)); 449extern long double atanhl _PARAMS((long double)); 450extern long double remainderl _PARAMS((long double, long double)); 451extern long double lgammal _PARAMS((long double)); 452extern long double erfl _PARAMS((long double)); 453extern long double erfcl _PARAMS((long double)); 454#endif /* ! defined (_REENT_ONLY) */ 455#else /* !_LDBL_EQ_DBL */ 456#ifdef __i386__ 457/* Other long double precision functions. */ 458extern _LONG_DOUBLE rintl _PARAMS((_LONG_DOUBLE)); 459extern long int lrintl _PARAMS((_LONG_DOUBLE)); 460extern _LONG_LONG_TYPE llrintl _PARAMS((_LONG_DOUBLE)); 461#endif /* __i386__ */ 462#endif /* !_LDBL_EQ_DBL */ 463 464#endif /* !defined (__STRICT_ANSI__) || defined(__cplusplus) || __STDC_VERSION__ >= 199901L */ 465 466#if !defined (__STRICT_ANSI__) || defined(__cplusplus) 467 468extern double drem _PARAMS((double, double)); 469extern void sincos _PARAMS((double, double *, double *)); 470extern double gamma_r _PARAMS((double, int *)); 471extern double lgamma_r _PARAMS((double, int *)); 472 473extern double y0 _PARAMS((double)); 474extern double y1 _PARAMS((double)); 475extern double yn _PARAMS((int, double)); 476extern double j0 _PARAMS((double)); 477extern double j1 _PARAMS((double)); 478extern double jn _PARAMS((int, double)); 479 480extern float dremf _PARAMS((float, float)); 481extern void sincosf _PARAMS((float, float *, float *)); 482extern float gammaf_r _PARAMS((float, int *)); 483extern float lgammaf_r _PARAMS((float, int *)); 484 485extern float y0f _PARAMS((float)); 486extern float y1f _PARAMS((float)); 487extern float ynf _PARAMS((int, float)); 488extern float j0f _PARAMS((float)); 489extern float j1f _PARAMS((float)); 490extern float jnf _PARAMS((int, float)); 491 492/* GNU extensions */ 493# ifndef exp10 494extern double exp10 _PARAMS((double)); 495# endif 496# ifndef pow10 497extern double pow10 _PARAMS((double)); 498# endif 499# ifndef exp10f 500extern float exp10f _PARAMS((float)); 501# endif 502# ifndef pow10f 503extern float pow10f _PARAMS((float)); 504# endif 505 506#endif /* !defined (__STRICT_ANSI__) || defined(__cplusplus) */ 507 508#ifndef __STRICT_ANSI__ 509 510/* The gamma functions use a global variable, signgam. */ 511#ifndef _REENT_ONLY 512#define signgam (*__signgam()) 513extern int *__signgam _PARAMS((void)); 514#endif /* ! defined (_REENT_ONLY) */ 515 516#define __signgam_r(ptr) _REENT_SIGNGAM(ptr) 517 518/* The exception structure passed to the matherr routine. */ 519/* We have a problem when using C++ since `exception' is a reserved 520 name in C++. */ 521#ifdef __cplusplus 522struct __exception 523#else 524struct exception 525#endif 526{ 527 int type; 528 char *name; 529 double arg1; 530 double arg2; 531 double retval; 532 int err; 533}; 534 535#ifdef __cplusplus 536extern int matherr _PARAMS((struct __exception *e)); 537#else 538extern int matherr _PARAMS((struct exception *e)); 539#endif 540 541/* Values for the type field of struct exception. */ 542 543#define DOMAIN 1 544#define SING 2 545#define OVERFLOW 3 546#define UNDERFLOW 4 547#define TLOSS 5 548#define PLOSS 6 549 550/* Useful constants. */ 551 552#define MAXFLOAT 3.40282347e+38F 553 554#define M_E 2.7182818284590452354 555#define M_LOG2E 1.4426950408889634074 556#define M_LOG10E 0.43429448190325182765 557#define M_LN2 _M_LN2 558#define M_LN10 2.30258509299404568402 559#define M_PI 3.14159265358979323846 560#define M_TWOPI (M_PI * 2.0) 561#define M_PI_2 1.57079632679489661923 562#define M_PI_4 0.78539816339744830962 563#define M_3PI_4 2.3561944901923448370E0 564#define M_SQRTPI 1.77245385090551602792981 565#define M_1_PI 0.31830988618379067154 566#define M_2_PI 0.63661977236758134308 567#define M_2_SQRTPI 1.12837916709551257390 568#define M_SQRT2 1.41421356237309504880 569#define M_SQRT1_2 0.70710678118654752440 570#define M_LN2LO 1.9082149292705877000E-10 571#define M_LN2HI 6.9314718036912381649E-1 572#define M_SQRT3 1.73205080756887719000 573#define M_IVLN10 0.43429448190325182765 /* 1 / log(10) */ 574#define M_LOG2_E _M_LN2 575#define M_INVLN2 1.4426950408889633870E0 /* 1 / log(2) */ 576 577/* Global control over fdlibm error handling. */ 578 579enum __fdlibm_version 580{ 581 __fdlibm_ieee = -1, 582 __fdlibm_svid, 583 __fdlibm_xopen, 584 __fdlibm_posix 585}; 586 587#define _LIB_VERSION_TYPE enum __fdlibm_version 588#define _LIB_VERSION __fdlib_version 589 590extern __IMPORT _LIB_VERSION_TYPE _LIB_VERSION; 591 592#define _IEEE_ __fdlibm_ieee 593#define _SVID_ __fdlibm_svid 594#define _XOPEN_ __fdlibm_xopen 595#define _POSIX_ __fdlibm_posix 596 597#endif /* ! defined (__STRICT_ANSI__) */ 598 599_END_STD_C 600 601#ifdef __FAST_MATH__ 602#include <machine/fastmath.h> 603#endif 604 605#endif /* _MATH_H_ */ 606