blob: 129cd93a1fc349716468c47476e01df9d73911e9 [file] [log] [blame]
<html lang="en">
<head>
<title>Control Functions - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Arithmetic.html#Arithmetic" title="Arithmetic">
<link rel="prev" href="Rounding.html#Rounding" title="Rounding">
<link rel="next" href="Arithmetic-Functions.html#Arithmetic-Functions" title="Arithmetic Functions">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Control-Functions"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Arithmetic-Functions.html#Arithmetic-Functions">Arithmetic Functions</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Rounding.html#Rounding">Rounding</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Arithmetic.html#Arithmetic">Arithmetic</a>
<hr>
</div>
<h3 class="section">20.7 Floating-Point Control Functions</h3>
<p>IEEE&nbsp;754<!-- /@w --> floating-point implementations allow the programmer to
decide whether traps will occur for each of the exceptions, by setting
bits in the <dfn>control word</dfn>. In C, traps result in the program
receiving the <code>SIGFPE</code> signal; see <a href="Signal-Handling.html#Signal-Handling">Signal Handling</a>.
<p><strong>NB:</strong> IEEE&nbsp;754<!-- /@w --> says that trap handlers are given details of
the exceptional situation, and can set the result value. C signals do
not provide any mechanism to pass this information back and forth.
Trapping exceptions in C is therefore not very useful.
<p>It is sometimes necessary to save the state of the floating-point unit
while you perform some calculation. The library provides functions
which save and restore the exception flags, the set of exceptions that
generate traps, and the rounding mode. This information is known as the
<dfn>floating-point environment</dfn>.
<p>The functions to save and restore the floating-point environment all use
a variable of type <code>fenv_t</code> to store information. This type is
defined in <samp><span class="file">fenv.h</span></samp>. Its size and contents are
implementation-defined. You should not attempt to manipulate a variable
of this type directly.
<p>To save the state of the FPU, use one of these functions:
<!-- fenv.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: int <b>fegetenv</b> (<var>fenv_t *envp</var>)<var><a name="index-fegetenv-2395"></a></var><br>
<blockquote><p>Store the floating-point environment in the variable pointed to by
<var>envp</var>.
<p>The function returns zero in case the operation was successful, a
non-zero value otherwise.
</p></blockquote></div>
<!-- fenv.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: int <b>feholdexcept</b> (<var>fenv_t *envp</var>)<var><a name="index-feholdexcept-2396"></a></var><br>
<blockquote><p>Store the current floating-point environment in the object pointed to by
<var>envp</var>. Then clear all exception flags, and set the FPU to trap no
exceptions. Not all FPUs support trapping no exceptions; if
<code>feholdexcept</code> cannot set this mode, it returns nonzero value. If it
succeeds, it returns zero.
</p></blockquote></div>
<p>The functions which restore the floating-point environment can take these
kinds of arguments:
<ul>
<li>Pointers to <code>fenv_t</code> objects, which were initialized previously by a
call to <code>fegetenv</code> or <code>feholdexcept</code>.
<li><a name="index-FE_005fDFL_005fENV-2397"></a>The special macro <code>FE_DFL_ENV</code> which represents the floating-point
environment as it was available at program start.
<li>Implementation defined macros with names starting with <code>FE_</code> and
having type <code>fenv_t *</code>.
<p><a name="index-FE_005fNOMASK_005fENV-2398"></a>If possible, the GNU C Library defines a macro <code>FE_NOMASK_ENV</code>
which represents an environment where every exception raised causes a
trap to occur. You can test for this macro using <code>#ifdef</code>. It is
only defined if <code>_GNU_SOURCE</code> is defined.
<p>Some platforms might define other predefined environments.
</ul>
<p class="noindent">To set the floating-point environment, you can use either of these
functions:
<!-- fenv.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: int <b>fesetenv</b> (<var>const fenv_t *envp</var>)<var><a name="index-fesetenv-2399"></a></var><br>
<blockquote><p>Set the floating-point environment to that described by <var>envp</var>.
<p>The function returns zero in case the operation was successful, a
non-zero value otherwise.
</p></blockquote></div>
<!-- fenv.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: int <b>feupdateenv</b> (<var>const fenv_t *envp</var>)<var><a name="index-feupdateenv-2400"></a></var><br>
<blockquote><p>Like <code>fesetenv</code>, this function sets the floating-point environment
to that described by <var>envp</var>. However, if any exceptions were
flagged in the status word before <code>feupdateenv</code> was called, they
remain flagged after the call. In other words, after <code>feupdateenv</code>
is called, the status word is the bitwise OR of the previous status word
and the one saved in <var>envp</var>.
<p>The function returns zero in case the operation was successful, a
non-zero value otherwise.
</p></blockquote></div>
<p class="noindent">To control for individual exceptions if raising them causes a trap to
occur, you can use the following two functions.
<p><strong>Portability Note:</strong> These functions are all GNU extensions.
<!-- fenv.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: int <b>feenableexcept</b> (<var>int excepts</var>)<var><a name="index-feenableexcept-2401"></a></var><br>
<blockquote><p>This functions enables traps for each of the exceptions as indicated by
the parameter <var>except</var>. The individual excepetions are described in
<a href="Status-bit-operations.html#Status-bit-operations">Status bit operations</a>. Only the specified exceptions are
enabled, the status of the other exceptions is not changed.
<p>The function returns the previous enabled exceptions in case the
operation was successful, <code>-1</code> otherwise.
</p></blockquote></div>
<!-- fenv.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: int <b>fedisableexcept</b> (<var>int excepts</var>)<var><a name="index-fedisableexcept-2402"></a></var><br>
<blockquote><p>This functions disables traps for each of the exceptions as indicated by
the parameter <var>except</var>. The individual excepetions are described in
<a href="Status-bit-operations.html#Status-bit-operations">Status bit operations</a>. Only the specified exceptions are
disabled, the status of the other exceptions is not changed.
<p>The function returns the previous enabled exceptions in case the
operation was successful, <code>-1</code> otherwise.
</p></blockquote></div>
<!-- fenv.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: int <b>fegetexcept</b> (<var>int excepts</var>)<var><a name="index-fegetexcept-2403"></a></var><br>
<blockquote><p>The function returns a bitmask of all currently enabled exceptions. It
returns <code>-1</code> in case of failure.
</p></blockquote></div>
</body></html>