fenv.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #ifndef _FENV_H
  2. #include <math/fenv.h>
  3. #ifndef _ISOMAC
  4. # include <stdbool.h>
  5. /* Now define the internal interfaces. */
  6. extern int __feclearexcept (int __excepts);
  7. extern int __fegetexcept (void);
  8. extern int __fegetexceptflag (fexcept_t *__flagp, int __excepts);
  9. extern int __feraiseexcept (int __excepts);
  10. extern int __fesetexceptflag (const fexcept_t *__flagp, int __excepts);
  11. extern int __fegetenv (fenv_t *__envp);
  12. extern int __fesetenv (const fenv_t *__envp);
  13. extern int __feupdateenv (const fenv_t *__envp);
  14. extern __typeof (fegetround) __fegetround __attribute_pure__;
  15. extern __typeof (feholdexcept) __feholdexcept;
  16. extern __typeof (fesetround) __fesetround;
  17. extern __typeof (fetestexcept) __fetestexcept;
  18. libm_hidden_proto (feraiseexcept)
  19. libm_hidden_proto (__feraiseexcept)
  20. libm_hidden_proto (fegetenv)
  21. libm_hidden_proto (__fegetenv)
  22. libm_hidden_proto (fegetround)
  23. libm_hidden_proto (__fegetround)
  24. libm_hidden_proto (fesetenv)
  25. libm_hidden_proto (__fesetenv)
  26. libm_hidden_proto (fesetround)
  27. libm_hidden_proto (__fesetround)
  28. libm_hidden_proto (feholdexcept)
  29. libm_hidden_proto (__feholdexcept)
  30. libm_hidden_proto (feupdateenv)
  31. libm_hidden_proto (__feupdateenv)
  32. libm_hidden_proto (fetestexcept)
  33. libm_hidden_proto (__fetestexcept)
  34. libm_hidden_proto (feclearexcept)
  35. libm_hidden_proto (__feclearexcept)
  36. /* Rounding mode context. This allows functions to set/restore rounding mode
  37. only when the desired rounding mode is different from the current rounding
  38. mode. */
  39. struct rm_ctx
  40. {
  41. fenv_t env;
  42. bool updated_status;
  43. };
  44. /* Track whether rounding mode macros were defined, since
  45. get-rounding-mode.h may define default versions if they weren't.
  46. FE_TONEAREST must always be defined (even if no changes of rounding
  47. mode are supported, glibc requires it to be defined to represent
  48. the default rounding mode). */
  49. # ifndef FE_TONEAREST
  50. # error "FE_TONEAREST not defined"
  51. # endif
  52. # if defined FE_DOWNWARD || defined FE_TOWARDZERO || defined FE_UPWARD
  53. # define FE_HAVE_ROUNDING_MODES 1
  54. # else
  55. # define FE_HAVE_ROUNDING_MODES 0
  56. # endif
  57. /* When no floating-point exceptions are defined in <fenv.h>, make
  58. feraiseexcept ignore its argument so that unconditional
  59. feraiseexcept calls do not cause errors for undefined exceptions.
  60. Define it to expand to a void expression so that any calls testing
  61. the result of feraiseexcept do produce errors. */
  62. # if FE_ALL_EXCEPT == 0
  63. # define feraiseexcept(excepts) ((void) 0)
  64. # define __feraiseexcept(excepts) ((void) 0)
  65. # endif
  66. /* Similarly, most <fenv.h> functions have trivial implementations in
  67. the absence of support for floating-point exceptions and rounding
  68. modes. */
  69. # if !FE_HAVE_ROUNDING_MODES
  70. # if FE_ALL_EXCEPT == 0
  71. extern inline int
  72. fegetenv (fenv_t *__e)
  73. {
  74. return 0;
  75. }
  76. extern inline int
  77. __fegetenv (fenv_t *__e)
  78. {
  79. return 0;
  80. }
  81. extern inline int
  82. feholdexcept (fenv_t *__e)
  83. {
  84. return 0;
  85. }
  86. extern inline int
  87. __feholdexcept (fenv_t *__e)
  88. {
  89. return 0;
  90. }
  91. extern inline int
  92. fesetenv (const fenv_t *__e)
  93. {
  94. return 0;
  95. }
  96. extern inline int
  97. __fesetenv (const fenv_t *__e)
  98. {
  99. return 0;
  100. }
  101. extern inline int
  102. feupdateenv (const fenv_t *__e)
  103. {
  104. return 0;
  105. }
  106. extern inline int
  107. __feupdateenv (const fenv_t *__e)
  108. {
  109. return 0;
  110. }
  111. # endif
  112. extern inline int
  113. fegetround (void)
  114. {
  115. return FE_TONEAREST;
  116. }
  117. extern inline int
  118. __fegetround (void)
  119. {
  120. return FE_TONEAREST;
  121. }
  122. extern inline int
  123. fesetround (int __d)
  124. {
  125. return 0;
  126. }
  127. extern inline int
  128. __fesetround (int __d)
  129. {
  130. return 0;
  131. }
  132. # endif
  133. #endif
  134. #endif