math.h 20 KB

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