Subversion Repositories Kolibri OS

Rev

Rev 4921 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

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