xref: /aosp_15_r20/bionic/libc/include/fenv.h (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*  $OpenBSD: fenv.h,v 1.2 2011/05/25 21:46:49 martynas Exp $ */
2*8d67ca89SAndroid Build Coastguard Worker /*  $NetBSD: fenv.h,v 1.2.4.1 2011/02/08 16:18:55 bouyer Exp $  */
3*8d67ca89SAndroid Build Coastguard Worker 
4*8d67ca89SAndroid Build Coastguard Worker /*
5*8d67ca89SAndroid Build Coastguard Worker  * Copyright (c) 2010 The NetBSD Foundation, Inc.
6*8d67ca89SAndroid Build Coastguard Worker  * All rights reserved.
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*8d67ca89SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*8d67ca89SAndroid Build Coastguard Worker  * are met:
11*8d67ca89SAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*8d67ca89SAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*8d67ca89SAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
15*8d67ca89SAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
16*8d67ca89SAndroid Build Coastguard Worker  *
17*8d67ca89SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18*8d67ca89SAndroid Build Coastguard Worker  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19*8d67ca89SAndroid Build Coastguard Worker  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20*8d67ca89SAndroid Build Coastguard Worker  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21*8d67ca89SAndroid Build Coastguard Worker  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*8d67ca89SAndroid Build Coastguard Worker  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*8d67ca89SAndroid Build Coastguard Worker  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24*8d67ca89SAndroid Build Coastguard Worker  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25*8d67ca89SAndroid Build Coastguard Worker  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26*8d67ca89SAndroid Build Coastguard Worker  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27*8d67ca89SAndroid Build Coastguard Worker  * POSSIBILITY OF SUCH DAMAGE.
28*8d67ca89SAndroid Build Coastguard Worker  */
29*8d67ca89SAndroid Build Coastguard Worker 
30*8d67ca89SAndroid Build Coastguard Worker #pragma once
31*8d67ca89SAndroid Build Coastguard Worker 
32*8d67ca89SAndroid Build Coastguard Worker /**
33*8d67ca89SAndroid Build Coastguard Worker  * @file fenv.h
34*8d67ca89SAndroid Build Coastguard Worker  * @brief Floating-point environment.
35*8d67ca89SAndroid Build Coastguard Worker  */
36*8d67ca89SAndroid Build Coastguard Worker 
37*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h>
38*8d67ca89SAndroid Build Coastguard Worker 
39*8d67ca89SAndroid Build Coastguard Worker #if defined(__aarch64__) || defined(__arm__)
40*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_arm.h>
41*8d67ca89SAndroid Build Coastguard Worker #elif defined(__i386__)
42*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_x86.h>
43*8d67ca89SAndroid Build Coastguard Worker #elif defined(__riscv)
44*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_riscv64.h>
45*8d67ca89SAndroid Build Coastguard Worker #elif defined(__x86_64__)
46*8d67ca89SAndroid Build Coastguard Worker #include <bits/fenv_x86_64.h>
47*8d67ca89SAndroid Build Coastguard Worker #endif
48*8d67ca89SAndroid Build Coastguard Worker 
49*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS
50*8d67ca89SAndroid Build Coastguard Worker 
51*8d67ca89SAndroid Build Coastguard Worker /**
52*8d67ca89SAndroid Build Coastguard Worker  * [feclearexcept(3)](https://man7.org/linux/man-pages/man3/feclearexcept.3.html)
53*8d67ca89SAndroid Build Coastguard Worker  * clears the given `exceptions` in hardware.
54*8d67ca89SAndroid Build Coastguard Worker  *
55*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
56*8d67ca89SAndroid Build Coastguard Worker  */
57*8d67ca89SAndroid Build Coastguard Worker int feclearexcept(int __exceptions);
58*8d67ca89SAndroid Build Coastguard Worker 
59*8d67ca89SAndroid Build Coastguard Worker /**
60*8d67ca89SAndroid Build Coastguard Worker  * [fegetexceptflag(3)](https://man7.org/linux/man-pages/man3/fegetexceptflag.3.html)
61*8d67ca89SAndroid Build Coastguard Worker  * copies the state of the given `exceptions` from hardware into `*flag_ptr`.
62*8d67ca89SAndroid Build Coastguard Worker  * See fesetexceptflag().
63*8d67ca89SAndroid Build Coastguard Worker  *
64*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
65*8d67ca89SAndroid Build Coastguard Worker  */
66*8d67ca89SAndroid Build Coastguard Worker int fegetexceptflag(fexcept_t* _Nonnull __flag_ptr, int __exceptions);
67*8d67ca89SAndroid Build Coastguard Worker 
68*8d67ca89SAndroid Build Coastguard Worker /**
69*8d67ca89SAndroid Build Coastguard Worker  * [feraiseexcept(3)](https://man7.org/linux/man-pages/man3/feraiseexcept.3.html)
70*8d67ca89SAndroid Build Coastguard Worker  * raises the given `exceptions` in hardware.
71*8d67ca89SAndroid Build Coastguard Worker  *
72*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
73*8d67ca89SAndroid Build Coastguard Worker  */
74*8d67ca89SAndroid Build Coastguard Worker int feraiseexcept(int __exceptions);
75*8d67ca89SAndroid Build Coastguard Worker 
76*8d67ca89SAndroid Build Coastguard Worker /**
77*8d67ca89SAndroid Build Coastguard Worker  * [fesetexceptflag(3)](https://man7.org/linux/man-pages/man3/fesetexceptflag.3.html)
78*8d67ca89SAndroid Build Coastguard Worker  * copies the state of the given `exceptions` from `*flag_ptr` into hardware.
79*8d67ca89SAndroid Build Coastguard Worker  * See fesetexceptflag().
80*8d67ca89SAndroid Build Coastguard Worker  *
81*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
82*8d67ca89SAndroid Build Coastguard Worker  */
83*8d67ca89SAndroid Build Coastguard Worker int fesetexceptflag(const fexcept_t* _Nonnull __flag_ptr, int __exceptions);
84*8d67ca89SAndroid Build Coastguard Worker 
85*8d67ca89SAndroid Build Coastguard Worker /**
86*8d67ca89SAndroid Build Coastguard Worker  * [fetestexcept(3)](https://man7.org/linux/man-pages/man3/fetestexcept.3.html)
87*8d67ca89SAndroid Build Coastguard Worker  * tests whether the given `exceptions` are set in hardware.
88*8d67ca89SAndroid Build Coastguard Worker  *
89*8d67ca89SAndroid Build Coastguard Worker  * Returns the currently-set subset of `exceptions`.
90*8d67ca89SAndroid Build Coastguard Worker  */
91*8d67ca89SAndroid Build Coastguard Worker int fetestexcept(int __exceptions);
92*8d67ca89SAndroid Build Coastguard Worker 
93*8d67ca89SAndroid Build Coastguard Worker /**
94*8d67ca89SAndroid Build Coastguard Worker  * [fegetround(3)](https://man7.org/linux/man-pages/man3/fegetround.3.html)
95*8d67ca89SAndroid Build Coastguard Worker  * returns the current rounding mode.
96*8d67ca89SAndroid Build Coastguard Worker  *
97*8d67ca89SAndroid Build Coastguard Worker  * Returns the rounding mode on success, and returns a negative value on failure.
98*8d67ca89SAndroid Build Coastguard Worker  */
99*8d67ca89SAndroid Build Coastguard Worker int fegetround(void);
100*8d67ca89SAndroid Build Coastguard Worker 
101*8d67ca89SAndroid Build Coastguard Worker /**
102*8d67ca89SAndroid Build Coastguard Worker  * [fesetround(3)](https://man7.org/linux/man-pages/man3/fesetround.3.html)
103*8d67ca89SAndroid Build Coastguard Worker  * sets the current rounding mode.
104*8d67ca89SAndroid Build Coastguard Worker  *
105*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
106*8d67ca89SAndroid Build Coastguard Worker  */
107*8d67ca89SAndroid Build Coastguard Worker int fesetround(int __rounding_mode);
108*8d67ca89SAndroid Build Coastguard Worker 
109*8d67ca89SAndroid Build Coastguard Worker /**
110*8d67ca89SAndroid Build Coastguard Worker  * [fegetenv(3)](https://man7.org/linux/man-pages/man3/fegetenv.3.html)
111*8d67ca89SAndroid Build Coastguard Worker  * gets the current floating-point environment. See fesetenv().
112*8d67ca89SAndroid Build Coastguard Worker  *
113*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
114*8d67ca89SAndroid Build Coastguard Worker  */
115*8d67ca89SAndroid Build Coastguard Worker int fegetenv(fenv_t* _Nonnull __env);
116*8d67ca89SAndroid Build Coastguard Worker 
117*8d67ca89SAndroid Build Coastguard Worker /**
118*8d67ca89SAndroid Build Coastguard Worker  * [feholdexcept(3)](https://man7.org/linux/man-pages/man3/feholdexcept.3.html)
119*8d67ca89SAndroid Build Coastguard Worker  * gets the current floating-point environment, clears the status flags, and
120*8d67ca89SAndroid Build Coastguard Worker  * ignores floating point exceptions. See fesetenv()/feupdateenv().
121*8d67ca89SAndroid Build Coastguard Worker  *
122*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
123*8d67ca89SAndroid Build Coastguard Worker  */
124*8d67ca89SAndroid Build Coastguard Worker int feholdexcept(fenv_t* _Nonnull __env);
125*8d67ca89SAndroid Build Coastguard Worker 
126*8d67ca89SAndroid Build Coastguard Worker /**
127*8d67ca89SAndroid Build Coastguard Worker  * [fesetenv(3)](https://man7.org/linux/man-pages/man3/fesetenv.3.html)
128*8d67ca89SAndroid Build Coastguard Worker  * sets the current floating-point environment. See fegetenv().
129*8d67ca89SAndroid Build Coastguard Worker  *
130*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
131*8d67ca89SAndroid Build Coastguard Worker  */
132*8d67ca89SAndroid Build Coastguard Worker int fesetenv(const fenv_t* _Nonnull __env);
133*8d67ca89SAndroid Build Coastguard Worker 
134*8d67ca89SAndroid Build Coastguard Worker /**
135*8d67ca89SAndroid Build Coastguard Worker  * [feupdateenv(3)](https://man7.org/linux/man-pages/man3/feupdateenv.3.html)
136*8d67ca89SAndroid Build Coastguard Worker  * sets the current floating-point environment to `*env` but with currently-raised
137*8d67ca89SAndroid Build Coastguard Worker  * exceptions still raised. See fesetenv().
138*8d67ca89SAndroid Build Coastguard Worker  *
139*8d67ca89SAndroid Build Coastguard Worker  * Returns 0 on success, and returns non-zero on failure.
140*8d67ca89SAndroid Build Coastguard Worker  */
141*8d67ca89SAndroid Build Coastguard Worker int feupdateenv(const fenv_t* _Nonnull __env);
142*8d67ca89SAndroid Build Coastguard Worker 
143*8d67ca89SAndroid Build Coastguard Worker /**
144*8d67ca89SAndroid Build Coastguard Worker  * [feenableexcept(3)](https://man7.org/linux/man-pages/man3/feenableexcept.3.html)
145*8d67ca89SAndroid Build Coastguard Worker  * sets the given `exceptions` to trap, if the hardware supports it. This is not
146*8d67ca89SAndroid Build Coastguard Worker  * generally useful on Android, because only x86/x86-64 can trap.
147*8d67ca89SAndroid Build Coastguard Worker  *
148*8d67ca89SAndroid Build Coastguard Worker  * Returns the previous set of enabled exceptions on success, and returns -1 on failure.
149*8d67ca89SAndroid Build Coastguard Worker  */
150*8d67ca89SAndroid Build Coastguard Worker int feenableexcept(int __exceptions);
151*8d67ca89SAndroid Build Coastguard Worker 
152*8d67ca89SAndroid Build Coastguard Worker /**
153*8d67ca89SAndroid Build Coastguard Worker  * [fedisableexcept(3)](https://man7.org/linux/man-pages/man3/fedisableexcept.3.html)
154*8d67ca89SAndroid Build Coastguard Worker  * sets the given `exceptions` to not trap, if the hardware supports it. This is not
155*8d67ca89SAndroid Build Coastguard Worker  * generally useful on Android, because only x86/x86-64 can trap.
156*8d67ca89SAndroid Build Coastguard Worker  *
157*8d67ca89SAndroid Build Coastguard Worker  * Returns the previous set of enabled exceptions on success, and returns -1 on failure.
158*8d67ca89SAndroid Build Coastguard Worker  */
159*8d67ca89SAndroid Build Coastguard Worker int fedisableexcept(int __exceptions);
160*8d67ca89SAndroid Build Coastguard Worker 
161*8d67ca89SAndroid Build Coastguard Worker /**
162*8d67ca89SAndroid Build Coastguard Worker  * [fegetexcept(3)](https://man7.org/linux/man-pages/man3/fegetexcept.3.html)
163*8d67ca89SAndroid Build Coastguard Worker  * returns the exceptions that currently trap. This is not generally useful on
164*8d67ca89SAndroid Build Coastguard Worker  * Android, because only x86/x86-64 can trap.
165*8d67ca89SAndroid Build Coastguard Worker  *
166*8d67ca89SAndroid Build Coastguard Worker  * Returns the exceptions that currently trap.
167*8d67ca89SAndroid Build Coastguard Worker  */
168*8d67ca89SAndroid Build Coastguard Worker int fegetexcept(void);
169*8d67ca89SAndroid Build Coastguard Worker 
170*8d67ca89SAndroid Build Coastguard Worker /** See FE_DFL_ENV. */
171*8d67ca89SAndroid Build Coastguard Worker extern const fenv_t __fe_dfl_env;
172*8d67ca89SAndroid Build Coastguard Worker 
173*8d67ca89SAndroid Build Coastguard Worker /**
174*8d67ca89SAndroid Build Coastguard Worker  * Constant representing the default floating-point environment
175*8d67ca89SAndroid Build Coastguard Worker  * (that is, the one installed at program startup).
176*8d67ca89SAndroid Build Coastguard Worker  *
177*8d67ca89SAndroid Build Coastguard Worker  * It can be used as an argument to the functions that manage the floating-point
178*8d67ca89SAndroid Build Coastguard Worker  * environment, namely fesetenv() and feupdateenv().
179*8d67ca89SAndroid Build Coastguard Worker  */
180*8d67ca89SAndroid Build Coastguard Worker #define FE_DFL_ENV (&__fe_dfl_env)
181*8d67ca89SAndroid Build Coastguard Worker 
182*8d67ca89SAndroid Build Coastguard Worker __END_DECLS
183