Floating-point environment

From cppreference.com
< cpp‎ | numeric

The floating-point environment is the set of floating-point status flags and control modes supported by the implementation. It is thread-local, each thread inherits the initial state of its floating-point environment from the parent thread. Floating-point operations modify the floating-point status flags to indicate abnormal results or auxiliary information. The state of floating-point control modes affects the outcomes of some floating-point operations.

The floating-point environment access and modification is only meaningful when #pragma STDC FENV_ACCESS is supported and is set to ON. Otherwise the implementation is free to assume that floating-point control modes are always the default ones and that floating-point status flags are never tested or modified. In practice, few current compilers, such as HP aCC, Oracle Studio, or IBM XL, support the #pragma explicitly, but most compilers allow meaningful access to the floating-point environment anyway.

Types

Defined in header <cfenv>
fenv_t The type representing the entire floating-point environment
fexcept_t The type representing all floating-point status flags collectively

Functions

clears the specified floating-point status flags
(function)
determines which of the specified floating-point status flags are set
(function)
raises the specified floating-point exceptions
(function)
copies the state of the specified floating-point status flags from or to the floating-point environment
(function)
(C++11)(C++11)
gets or sets rounding direction
(function)
saves or restores the current floating point environment
(function)
saves the environment, clears all status flags and ignores all future errors
(function)
restores the floating-point environment and raises the previously raise exceptions
(function)

Macros

floating-point exceptions
(macro constant)
floating-point rounding direction
(macro constant)
default floating-point environment
(macro constant)

Notes

The floating-point exceptions are not related to the C++ exceptions. When a floating-point operation raises a floating-point exception, the status of the floating-point environment changes, which can be tested with std::fetestexcept, but the execution of a C++ program on most implementations continues uninterrupted.

There are compiler extensions that may be used to generate C++ exceptions automatically whenever a floating-point exception is raised:

  • GNU libc function feenableexcept() enables trapping of the floating-point exceptions, which generates the signal SIGFPE. If the compiler option -fnon-call-exceptions was used, the handler for that signal may throw a user-defined C++ exception.
  • MSVC function _control87() enables trapping of the floating-point exceptions, which generates a hardware exception, which can be converted to C++ exceptions with _set_se_translator.

See also