FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
Определено в заголовке <cfenv> | ||
|---|---|---|
#define FE_DIVBYZERO /*implementation defined power of 2*/ | (с C++11) | |
#define FE_INEXACT /*implementation defined power of 2*/ | (с C++11) | |
#define FE_INVALID /*implementation defined power of 2*/ | (с C++11) | |
#define FE_OVERFLOW /*implementation defined power of 2*/ | (с C++11) | |
#define FE_UNDERFLOW /*implementation defined power of 2*/ | (с C++11) | |
#define FE_ALL_EXCEPT FE_DIVBYZERO | FE_INEXACT | \
FE_INVALID | FE_OVERFLOW | \
FE_UNDERFLOW
| (с C++11) |
Все эти макро-константы (кроме FE_ALL_EXCEPT) расширяются до целочисленных константных выражений, которые являются различными степенями двойки, уникально идентифицируя все поддерживаемые исключения с плавающей запятой. Каждый макрос определяется только в том случае, если он поддерживается.
Макроконстанта FE_ALL_EXCEPT, которая расширяется до побитового ИЛИ всех остальных FE_*, всегда определена и равна нулю, если исключения с плавающей запятой не поддерживаются реализацией.
| Константа | Объяснение |
|---|---|
FE_DIVBYZERO | произошла ошибка поля в предыдущей операции с плавающей запятой |
FE_INEXACT | неточный результат: округление было необходимым для хранения результата предыдущей операции с плавающей запятой |
FE_INVALID | произошла ошибка области в предыдущей операции с плавающей запятой |
FE_OVERFLOW | результат предыдущей операции с плавающей запятой был слишком велик, чтобы быть представленным |
FE_UNDERFLOW | результат предыдущей операции с плавающей запятой был субнормальным с потерей точности |
FE_ALL_EXCEPT | побитовое ИЛИ всех поддерживаемых исключений с плавающей запятой |
Реализация может определить дополнительные макро-константы в <cfenv> для идентификации дополнительных исключений с плавающей запятой. Все такие константы начинаются с FE_ и за ним следует по крайней мере одна заглавная буква.
См. math_errhandling для получения дополнительной информации.
Пример
#include <cfenv>
#include <cmath>
#include <iostream>
// #pragma STDC FENV_ACCESS ON
volatile double zero = 0.0; // volatile not needed where FENV_ACCESS is supported
volatile double one = 1.0; // volatile not needed where FENV_ACCESS is supported
int main()
{
std::feclearexcept(FE_ALL_EXCEPT);
std::cout << "1.0/0.0 = " << 1.0 / zero << '\n';
if (std::fetestexcept(FE_DIVBYZERO))
std::cout << "division by zero reported\n";
else
std::cout << "division by zero not reported\n";
std::feclearexcept(FE_ALL_EXCEPT);
std::cout << "1.0/10 = " << one / 10 << '\n';
if (std::fetestexcept(FE_INEXACT))
std::cout << "inexact result reported\n";
else
std::cout << "inexact result not reported\n";
std::feclearexcept(FE_ALL_EXCEPT);
std::cout << "sqrt(-1) = " << std::sqrt(-1) << '\n';
if (std::fetestexcept(FE_INVALID))
std::cout << "invalid result reported\n";
else
std::cout << "invalid result not reported\n";
}Возможный вывод:
1.0/0.0 = inf division by zero reported 1.0/10 = 0.1 inexact result reported sqrt(-1) = -nan invalid result reported
См. также
|
(C++11)(C++11)(C++11) | определяет механизм обработки ошибок, используемый общими математическими функциями (макро-константа) |
| Документация на C для макросов исключений с плавающей запятой | |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/numeric/fenv/FE_exceptions