Subversion Repositories Kolibri OS

Rev

Rev 4874 | Rev 6099 | 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) || __STDC_VERSION__ >= 199901L
  140.  
  141. /* ISO C99 types and macros. */
  142.  
  143. /* FIXME:  FLT_EVAL_METHOD should somehow be gotten from float.h (which is hard,
  144.  * considering that the standard says the includes it defines should not
  145.  * include other includes that it defines) and that value used.  (This can be
  146.  * solved, but autoconf has a bug which makes the solution more difficult, so
  147.  * it has been skipped for now.)  */
  148. #if !defined(FLT_EVAL_METHOD) && defined(__FLT_EVAL_METHOD__)
  149.   #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
  150.   #define __TMP_FLT_EVAL_METHOD
  151. #endif /* FLT_EVAL_METHOD */
  152. #if defined FLT_EVAL_METHOD
  153.   #if FLT_EVAL_METHOD == 0
  154.     typedef float  float_t;
  155.     typedef double double_t;
  156.    #elif FLT_EVAL_METHOD == 1
  157.     typedef double float_t;
  158.     typedef double double_t;
  159.    #elif FLT_EVAL_METHOD == 2
  160.     typedef long double float_t;
  161.     typedef long double double_t;
  162.    #else
  163.     /* Implementation-defined.  Assume float_t and double_t have been
  164.      * defined previously for this configuration (e.g. config.h). */
  165.   #endif
  166. #else
  167.     /* Assume basic definitions.  */
  168.     typedef float  float_t;
  169.     typedef double double_t;
  170. #endif
  171. #if defined(__TMP_FLT_EVAL_METHOD)
  172.   #undef FLT_EVAL_METHOD
  173. #endif
  174.  
  175. #define FP_NAN         0
  176. #define FP_INFINITE    1
  177. #define FP_ZERO        2
  178. #define FP_SUBNORMAL   3
  179. #define FP_NORMAL      4
  180.  
  181. #ifndef FP_ILOGB0
  182. # define FP_ILOGB0 (-INT_MAX)
  183. #endif
  184. #ifndef FP_ILOGBNAN
  185. # define FP_ILOGBNAN INT_MAX
  186. #endif
  187.  
  188. #ifndef MATH_ERRNO
  189. # define MATH_ERRNO 1
  190. #endif
  191. #ifndef MATH_ERREXCEPT
  192. # define MATH_ERREXCEPT 2
  193. #endif
  194. #ifndef math_errhandling
  195. # define math_errhandling MATH_ERRNO
  196. #endif
  197.  
  198. extern int __isinff (float x);
  199. extern int __isinfd (double x);
  200. extern int __isnanf (float x);
  201. extern int __isnand (double x);
  202. extern int __fpclassifyf (float x);
  203. extern int __fpclassifyd (double x);
  204. extern int __signbitf (float x);
  205. extern int __signbitd (double x);
  206.  
  207. #define fpclassify(__x) \
  208.         ((sizeof(__x) == sizeof(float))  ? __fpclassifyf(__x) : \
  209.         __fpclassifyd(__x))
  210.  
  211. #ifndef isfinite
  212.   #define isfinite(__y) \
  213.           (__extension__ ({int __cy = fpclassify(__y); \
  214.                            __cy != FP_INFINITE && __cy != FP_NAN;}))
  215. #endif
  216.  
  217. /* Note: isinf and isnan were once functions in newlib that took double
  218.  *       arguments.  C99 specifies that these names are reserved for macros
  219.  *       supporting multiple floating point types.  Thus, they are
  220.  *       now defined as macros.  Implementations of the old functions
  221.  *       taking double arguments still exist for compatibility purposes
  222.  *       (prototypes for them are in <ieeefp.h>).  */
  223. #ifndef isinf
  224.   #define isinf(y) (fpclassify(y) == FP_INFINITE)
  225. #endif
  226.  
  227. #ifndef isnan
  228.   #define isnan(y) (fpclassify(y) == FP_NAN)
  229. #endif
  230.  
  231. #define isnormal(y) (fpclassify(y) == FP_NORMAL)
  232. #define signbit(__x) \
  233.         ((sizeof(__x) == sizeof(float))  ?  __signbitf(__x) : \
  234.                 __signbitd(__x))
  235.  
  236. #define isgreater(x,y) \
  237.           (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
  238.                            !isunordered(__x,__y) && (__x > __y);}))
  239. #define isgreaterequal(x,y) \
  240.           (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
  241.                            !isunordered(__x,__y) && (__x >= __y);}))
  242. #define isless(x,y) \
  243.           (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
  244.                            !isunordered(__x,__y) && (__x < __y);}))
  245. #define islessequal(x,y) \
  246.           (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
  247.                            !isunordered(__x,__y) && (__x <= __y);}))
  248. #define islessgreater(x,y) \
  249.           (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \
  250.                            !isunordered(__x,__y) && (__x < __y || __x > __y);}))
  251.  
  252. #define isunordered(a,b) \
  253.           (__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \
  254.                            fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;}))
  255.  
  256. /* Non ANSI double precision functions.  */
  257.  
  258. extern double infinity _PARAMS((void));
  259. extern double nan _PARAMS((const char *));
  260. extern int finite _PARAMS((double));
  261. extern double copysign _PARAMS((double, double));
  262. extern double logb _PARAMS((double));
  263. extern int ilogb _PARAMS((double));
  264.  
  265. extern double asinh _PARAMS((double));
  266. extern double cbrt _PARAMS((double));
  267. extern double nextafter _PARAMS((double, double));
  268. extern double rint _PARAMS((double));
  269. extern double scalbn _PARAMS((double, int));
  270.  
  271. extern double exp2 _PARAMS((double));
  272. extern double scalbln _PARAMS((double, long int));
  273. extern double tgamma _PARAMS((double));
  274. extern double nearbyint _PARAMS((double));
  275. extern long int lrint _PARAMS((double));
  276. extern _LONG_LONG_TYPE int llrint _PARAMS((double));
  277. extern double round _PARAMS((double));
  278. extern long int lround _PARAMS((double));
  279. extern long long int llround _PARAMS((double));
  280. extern double trunc _PARAMS((double));
  281. extern double remquo _PARAMS((double, double, int *));
  282. extern double fdim _PARAMS((double, double));
  283. extern double fmax _PARAMS((double, double));
  284. extern double fmin _PARAMS((double, double));
  285. extern double fma _PARAMS((double, double, double));
  286.  
  287. #ifndef __math_68881
  288. extern double log1p _PARAMS((double));
  289. extern double expm1 _PARAMS((double));
  290. #endif /* ! defined (__math_68881) */
  291.  
  292. #ifndef _REENT_ONLY
  293. extern double acosh _PARAMS((double));
  294. extern double atanh _PARAMS((double));
  295. extern double remainder _PARAMS((double, double));
  296. extern double gamma _PARAMS((double));
  297. extern double lgamma _PARAMS((double));
  298. extern double erf _PARAMS((double));
  299. extern double erfc _PARAMS((double));
  300. extern double log2 _PARAMS((double));
  301. #if !defined(__cplusplus)
  302. #define log2(x) (log (x) / _M_LN2)
  303. #endif
  304.  
  305. #ifndef __math_68881
  306. extern double hypot _PARAMS((double, double));
  307. #endif
  308.  
  309. #endif /* ! defined (_REENT_ONLY) */
  310.  
  311. /* Single precision versions of ANSI functions.  */
  312.  
  313. extern float atanf _PARAMS((float));
  314. extern float cosf _PARAMS((float));
  315. extern float sinf _PARAMS((float));
  316. extern float tanf _PARAMS((float));
  317. extern float tanhf _PARAMS((float));
  318. extern float frexpf _PARAMS((float, int *));
  319. extern float modff _PARAMS((float, float *));
  320. extern float ceilf _PARAMS((float));
  321. extern float fabsf _PARAMS((float));
  322. extern float floorf _PARAMS((float));
  323.  
  324. #ifndef _REENT_ONLY
  325. extern float acosf _PARAMS((float));
  326. extern float asinf _PARAMS((float));
  327. extern float atan2f _PARAMS((float, float));
  328. extern float coshf _PARAMS((float));
  329. extern float sinhf _PARAMS((float));
  330. extern float expf _PARAMS((float));
  331. extern float ldexpf _PARAMS((float, int));
  332. extern float logf _PARAMS((float));
  333. extern float log10f _PARAMS((float));
  334. extern float powf _PARAMS((float, float));
  335. extern float sqrtf _PARAMS((float));
  336. extern float fmodf _PARAMS((float, float));
  337. #endif /* ! defined (_REENT_ONLY) */
  338.  
  339. /* Other single precision functions.  */
  340.  
  341. extern float exp2f _PARAMS((float));
  342. extern float scalblnf _PARAMS((float, long int));
  343. extern float tgammaf _PARAMS((float));
  344. extern float nearbyintf _PARAMS((float));
  345. extern long int lrintf _PARAMS((float));
  346. extern _LONG_LONG_TYPE llrintf _PARAMS((float));
  347. extern float roundf _PARAMS((float));
  348. extern long int lroundf _PARAMS((float));
  349. extern long long int llroundf _PARAMS((float));
  350. extern float truncf _PARAMS((float));
  351. extern float remquof _PARAMS((float, float, int *));
  352. extern float fdimf _PARAMS((float, float));
  353. extern float fmaxf _PARAMS((float, float));
  354. extern float fminf _PARAMS((float, float));
  355. extern float fmaf _PARAMS((float, float, float));
  356.  
  357. extern float infinityf _PARAMS((void));
  358. extern float nanf _PARAMS((const char *));
  359. extern int finitef _PARAMS((float));
  360. extern float copysignf _PARAMS((float, float));
  361. extern float logbf _PARAMS((float));
  362. extern int ilogbf _PARAMS((float));
  363.  
  364. extern float asinhf _PARAMS((float));
  365. extern float cbrtf _PARAMS((float));
  366. extern float nextafterf _PARAMS((float, float));
  367. extern float rintf _PARAMS((float));
  368. extern float scalbnf _PARAMS((float, int));
  369. extern float log1pf _PARAMS((float));
  370. extern float expm1f _PARAMS((float));
  371.  
  372. #ifndef _REENT_ONLY
  373. extern float acoshf _PARAMS((float));
  374. extern float atanhf _PARAMS((float));
  375. extern float remainderf _PARAMS((float, float));
  376. extern float gammaf _PARAMS((float));
  377. extern float lgammaf _PARAMS((float));
  378. extern float erff _PARAMS((float));
  379. extern float erfcf _PARAMS((float));
  380. extern float log2f _PARAMS((float));
  381. extern float hypotf _PARAMS((float, float));
  382. #endif /* ! defined (_REENT_ONLY) */
  383.  
  384. /* On platforms where long double equals double.  */
  385. #ifdef _LDBL_EQ_DBL
  386. /* Reentrant ANSI C functions.  */
  387. #ifndef __math_68881
  388. extern long double atanl _PARAMS((long double));
  389. extern long double cosl _PARAMS((long double));
  390. extern long double sinl _PARAMS((long double));
  391. extern long double tanl _PARAMS((long double));
  392. extern long double tanhl _PARAMS((long double));
  393. extern long double frexpl _PARAMS((long double value, int *));
  394. extern long double modfl _PARAMS((long double, long double *));
  395. extern long double ceill _PARAMS((long double));
  396. extern long double fabsl _PARAMS((long double));
  397. extern long double floorl _PARAMS((long double));
  398. extern long double log1pl _PARAMS((long double));
  399. extern long double expm1l _PARAMS((long double));
  400. #endif /* ! defined (__math_68881) */
  401. /* Non reentrant ANSI C functions.  */
  402. #ifndef _REENT_ONLY
  403. #ifndef __math_68881
  404. extern long double acosl _PARAMS((long double));
  405. extern long double asinl _PARAMS((long double));
  406. extern long double atan2l _PARAMS((long double, long double));
  407. extern long double coshl _PARAMS((long double));
  408. extern long double sinhl _PARAMS((long double));
  409. extern long double expl _PARAMS((long double));
  410. extern long double ldexpl _PARAMS((long double, int));
  411. extern long double logl _PARAMS((long double));
  412. extern long double log10l _PARAMS((long double));
  413. extern long double powl _PARAMS((long double, long double));
  414. extern long double sqrtl _PARAMS((long double));
  415. extern long double fmodl _PARAMS((long double, long double));
  416. extern long double hypotl _PARAMS((long double, long double));
  417. #endif /* ! defined (__math_68881) */
  418. #endif /* ! defined (_REENT_ONLY) */
  419. extern long double copysignl _PARAMS((long double, long double));
  420. extern long double nanl _PARAMS((const char *));
  421. extern int ilogbl _PARAMS((long double));
  422. extern long double asinhl _PARAMS((long double));
  423. extern long double cbrtl _PARAMS((long double));
  424. extern long double nextafterl _PARAMS((long double, long double));
  425. extern long double rintl _PARAMS((long double));
  426. extern long double scalbnl _PARAMS((long double, int));
  427. extern long double exp2l _PARAMS((long double));
  428. extern long double scalblnl _PARAMS((long double, long));
  429. extern long double tgammal _PARAMS((long double));
  430. extern long double nearbyintl _PARAMS((long double));
  431. extern long int lrintl _PARAMS((long double));
  432. extern long long int llrintl _PARAMS((long double));
  433. extern long double roundl _PARAMS((long double));
  434. extern long lroundl _PARAMS((long double));
  435. extern _LONG_LONG_TYPE int llroundl _PARAMS((long double));
  436. extern long double truncl _PARAMS((long double));
  437. extern long double remquol _PARAMS((long double, long double, int *));
  438. extern long double fdiml _PARAMS((long double, long double));
  439. extern long double fmaxl _PARAMS((long double, long double));
  440. extern long double fminl _PARAMS((long double, long double));
  441. extern long double fmal _PARAMS((long double, long double, long double));
  442. #ifndef _REENT_ONLY
  443. extern long double acoshl _PARAMS((long double));
  444. extern long double atanhl _PARAMS((long double));
  445. extern long double remainderl _PARAMS((long double, long double));
  446. extern long double lgammal _PARAMS((long double));
  447. extern long double erfl _PARAMS((long double));
  448. extern long double erfcl _PARAMS((long double));
  449. #endif /* ! defined (_REENT_ONLY) */
  450. #else /* !_LDBL_EQ_DBL */
  451. #ifdef __i386__
  452. /* Other long double precision functions.  */
  453. extern _LONG_DOUBLE rintl _PARAMS((_LONG_DOUBLE));
  454. extern long int lrintl _PARAMS((_LONG_DOUBLE));
  455. extern _LONG_LONG_TYPE llrintl _PARAMS((_LONG_DOUBLE));
  456. #endif /* __i386__ */
  457. #endif /* !_LDBL_EQ_DBL */
  458.  
  459. #endif /* !defined (__STRICT_ANSI__) || defined(__cplusplus) || __STDC_VERSION__ >= 199901L */
  460.  
  461. #if !defined (__STRICT_ANSI__) || defined(__cplusplus)
  462.  
  463. extern double drem _PARAMS((double, double));
  464. extern void sincos _PARAMS((double, double *, double *));
  465. extern double gamma_r _PARAMS((double, int *));
  466. extern double lgamma_r _PARAMS((double, int *));
  467.  
  468. extern double y0 _PARAMS((double));
  469. extern double y1 _PARAMS((double));
  470. extern double yn _PARAMS((int, double));
  471. extern double j0 _PARAMS((double));
  472. extern double j1 _PARAMS((double));
  473. extern double jn _PARAMS((int, double));
  474.  
  475. extern float dremf _PARAMS((float, float));
  476. extern void sincosf _PARAMS((float, float *, float *));
  477. extern float gammaf_r _PARAMS((float, int *));
  478. extern float lgammaf_r _PARAMS((float, int *));
  479.  
  480. extern float y0f _PARAMS((float));
  481. extern float y1f _PARAMS((float));
  482. extern float ynf _PARAMS((int, float));
  483. extern float j0f _PARAMS((float));
  484. extern float j1f _PARAMS((float));
  485. extern float jnf _PARAMS((int, float));
  486.  
  487. /* GNU extensions */
  488. # ifndef exp10
  489. extern double exp10 _PARAMS((double));
  490. # endif
  491. # ifndef pow10
  492. extern double pow10 _PARAMS((double));
  493. # endif
  494. # ifndef exp10f
  495. extern float exp10f _PARAMS((float));
  496. # endif
  497. # ifndef pow10f
  498. extern float pow10f _PARAMS((float));
  499. # endif
  500.  
  501. #endif /* !defined (__STRICT_ANSI__) || defined(__cplusplus) */
  502.  
  503. #ifndef __STRICT_ANSI__
  504.  
  505. /* The gamma functions use a global variable, signgam.  */
  506. #ifndef _REENT_ONLY
  507. #define signgam (*__signgam())
  508. extern int *__signgam _PARAMS((void));
  509. #endif /* ! defined (_REENT_ONLY) */
  510.  
  511. #define __signgam_r(ptr) _REENT_SIGNGAM(ptr)
  512.  
  513. /* The exception structure passed to the matherr routine.  */
  514. /* We have a problem when using C++ since `exception' is a reserved
  515.    name in C++.  */
  516. #ifdef __cplusplus
  517. struct __exception
  518. #else
  519. struct exception
  520. #endif
  521. {
  522.   int type;
  523.   char *name;
  524.   double arg1;
  525.   double arg2;
  526.   double retval;
  527.   int err;
  528. };
  529.  
  530. #ifdef __cplusplus
  531. extern int matherr _PARAMS((struct __exception *e));
  532. #else
  533. extern int matherr _PARAMS((struct exception *e));
  534. #endif
  535.  
  536. /* Values for the type field of struct exception.  */
  537.  
  538. #define DOMAIN 1
  539. #define SING 2
  540. #define OVERFLOW 3
  541. #define UNDERFLOW 4
  542. #define TLOSS 5
  543. #define PLOSS 6
  544.  
  545. /* Useful constants.  */
  546.  
  547. #define MAXFLOAT        3.40282347e+38F
  548.  
  549. #define M_E             2.7182818284590452354
  550. #define M_LOG2E         1.4426950408889634074
  551. #define M_LOG10E        0.43429448190325182765
  552. #define M_LN2           _M_LN2
  553. #define M_LN10          2.30258509299404568402
  554. #define M_PI            3.14159265358979323846
  555. #define M_TWOPI         (M_PI * 2.0)
  556. #define M_PI_2          1.57079632679489661923
  557. #define M_PI_4          0.78539816339744830962
  558. #define M_3PI_4         2.3561944901923448370E0
  559. #define M_SQRTPI        1.77245385090551602792981
  560. #define M_1_PI          0.31830988618379067154
  561. #define M_2_PI          0.63661977236758134308
  562. #define M_2_SQRTPI      1.12837916709551257390
  563. #define M_SQRT2         1.41421356237309504880
  564. #define M_SQRT1_2       0.70710678118654752440
  565. #define M_LN2LO         1.9082149292705877000E-10
  566. #define M_LN2HI         6.9314718036912381649E-1
  567. #define M_SQRT3 1.73205080756887719000
  568. #define M_IVLN10        0.43429448190325182765 /* 1 / log(10) */
  569. #define M_LOG2_E        _M_LN2
  570. #define M_INVLN2        1.4426950408889633870E0  /* 1 / log(2) */
  571.  
  572. /* Global control over fdlibm error handling.  */
  573.  
  574. enum __fdlibm_version
  575. {
  576.   __fdlibm_ieee = -1,
  577.   __fdlibm_svid,
  578.   __fdlibm_xopen,
  579.   __fdlibm_posix
  580. };
  581.  
  582. #define _LIB_VERSION_TYPE enum __fdlibm_version
  583. #define _LIB_VERSION __fdlib_version
  584.  
  585. extern __IMPORT _LIB_VERSION_TYPE _LIB_VERSION;
  586.  
  587. #define _IEEE_  __fdlibm_ieee
  588. #define _SVID_  __fdlibm_svid
  589. #define _XOPEN_ __fdlibm_xopen
  590. #define _POSIX_ __fdlibm_posix
  591.  
  592. #endif /* ! defined (__STRICT_ANSI__) */
  593.  
  594. _END_STD_C
  595.  
  596. #ifdef __FAST_MATH__
  597. #include <machine/fastmath.h>
  598. #endif
  599.  
  600. #endif /* _MATH_H_ */
  601.