Subversion Repositories Kolibri OS

Rev

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