master
  1/* Copyright (C) 1997-2025 Free Software Foundation, Inc.
  2   This file is part of the GNU C Library.
  3
  4   The GNU C Library is free software; you can redistribute it and/or
  5   modify it under the terms of the GNU Lesser General Public
  6   License as published by the Free Software Foundation; either
  7   version 2.1 of the License, or (at your option) any later version.
  8
  9   The GNU C Library is distributed in the hope that it will be useful,
 10   but WITHOUT ANY WARRANTY; without even the implied warranty of
 11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 12   Lesser General Public License for more details.
 13
 14   You should have received a copy of the GNU Lesser General Public
 15   License along with the GNU C Library; if not, see
 16   <https://www.gnu.org/licenses/>.  */
 17
 18/*
 19 * ISO C99 7.6: Floating-point environment	<fenv.h>
 20 */
 21
 22#ifndef _FENV_H
 23#define _FENV_H	1
 24
 25#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
 26#include <bits/libc-header-start.h>
 27
 28/* Get the architecture dependent definitions.  The following definitions
 29   are expected to be done:
 30
 31   fenv_t	type for object representing an entire floating-point
 32		environment
 33
 34   FE_DFL_ENV	macro of type pointer to fenv_t to be used as the argument
 35		to functions taking an argument of type fenv_t; in this
 36		case the default environment will be used
 37
 38   fexcept_t	type for object representing the floating-point exception
 39		flags including status associated with the flags
 40
 41   femode_t	type for object representing floating-point control modes
 42
 43   FE_DFL_MODE	macro of type pointer to const femode_t to be used as the
 44		argument to fesetmode; in this case the default control
 45		modes will be used
 46
 47   The following macros are defined iff the implementation supports this
 48   kind of exception.
 49   FE_INEXACT		inexact result
 50   FE_DIVBYZERO		division by zero
 51   FE_UNDERFLOW		result not representable due to underflow
 52   FE_OVERFLOW		result not representable due to overflow
 53   FE_INVALID		invalid operation
 54
 55   FE_ALL_EXCEPT	bitwise OR of all supported exceptions
 56
 57   The next macros are defined iff the appropriate rounding mode is
 58   supported by the implementation.
 59   FE_TONEAREST		round to nearest
 60   FE_UPWARD		round toward +Inf
 61   FE_DOWNWARD		round toward -Inf
 62   FE_TOWARDZERO	round toward 0
 63*/
 64#include <bits/fenv.h>
 65
 66__BEGIN_DECLS
 67
 68/* Floating-point exception handling.  */
 69
 70/* Clear the supported exceptions represented by EXCEPTS.  */
 71extern int feclearexcept (int __excepts) __THROW;
 72
 73/* Store implementation-defined representation of the exception flags
 74   indicated by EXCEPTS in the object pointed to by FLAGP.  */
 75extern int fegetexceptflag (fexcept_t *__flagp, int __excepts) __THROW;
 76
 77/* Raise the supported exceptions represented by EXCEPTS.  */
 78extern int feraiseexcept (int __excepts) __THROW;
 79
 80#if __GLIBC_USE (IEC_60559_BFP_EXT_C23)
 81/* Set the supported exception flags represented by EXCEPTS, without
 82   causing enabled traps to be taken.  */
 83extern int fesetexcept (int __excepts) __THROW;
 84#endif
 85
 86/* Set complete status for exceptions indicated by EXCEPTS according to
 87   the representation in the object pointed to by FLAGP.  */
 88extern int fesetexceptflag (const fexcept_t *__flagp, int __excepts) __THROW;
 89
 90/* Determine which of subset of the exceptions specified by EXCEPTS are
 91   currently set.  */
 92extern int fetestexcept (int __excepts) __THROW;
 93
 94#if __GLIBC_USE (IEC_60559_BFP_EXT_C23)
 95/* Determine which of subset of the exceptions specified by EXCEPTS
 96   are set in *FLAGP.  */
 97extern int fetestexceptflag (const fexcept_t *__flagp, int __excepts) __THROW;
 98#endif
 99
100
101/* Rounding control.  */
102
103/* Get current rounding direction.  */
104extern int fegetround (void) __THROW __attribute_pure__;
105
106/* Establish the rounding direction represented by ROUND.  */
107extern int fesetround (int __rounding_direction) __THROW;
108
109
110/* Floating-point environment.  */
111
112/* Store the current floating-point environment in the object pointed
113   to by ENVP.  */
114extern int fegetenv (fenv_t *__envp) __THROW;
115
116/* Save the current environment in the object pointed to by ENVP, clear
117   exception flags and install a non-stop mode (if available) for all
118   exceptions.  */
119extern int feholdexcept (fenv_t *__envp) __THROW;
120
121/* Establish the floating-point environment represented by the object
122   pointed to by ENVP.  */
123extern int fesetenv (const fenv_t *__envp) __THROW;
124
125/* Save current exceptions in temporary storage, install environment
126   represented by object pointed to by ENVP and raise exceptions
127   according to saved exceptions.  */
128extern int feupdateenv (const fenv_t *__envp) __THROW;
129
130
131/* Control modes.  */
132
133#if __GLIBC_USE (IEC_60559_BFP_EXT_C23)
134/* Store the current floating-point control modes in the object
135   pointed to by MODEP.  */
136extern int fegetmode (femode_t *__modep) __THROW;
137
138/* Establish the floating-point control modes represented by the
139   object pointed to by MODEP.  */
140extern int fesetmode (const femode_t *__modep) __THROW;
141#endif
142
143
144/* NaN support.  */
145
146#if (__GLIBC_USE (IEC_60559_BFP_EXT_C23)		\
147     && defined FE_INVALID			\
148     && defined __SUPPORT_SNAN__)
149# define FE_SNANS_ALWAYS_SIGNAL	1
150#endif
151
152#ifdef __USE_GNU
153
154/* Enable individual exceptions.  Will not enable more exceptions than
155   EXCEPTS specifies.  Returns the previous enabled exceptions if all
156   exceptions are successfully set, otherwise returns -1.  */
157extern int feenableexcept (int __excepts) __THROW;
158
159/* Disable individual exceptions.  Will not disable more exceptions than
160   EXCEPTS specifies.  Returns the previous enabled exceptions if all
161   exceptions are successfully disabled, otherwise returns -1.  */
162extern int fedisableexcept (int __excepts) __THROW;
163
164/* Return enabled exceptions.  */
165extern int fegetexcept (void) __THROW;
166#endif
167
168__END_DECLS
169
170#endif /* fenv.h */