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) раскрываются в целочисленные константные выражения, являющиеся различными степенями числа 2, которые однозначно идентифицируют все поддерживаемые исключения с плавающей точкой. Каждая макроконстанта определяется только в том случае, если она поддерживается.
Макроконстанта 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/cpp/numeric/fenv/FE_exceptions