Окружение чисел с плавающей точкой (начиная с C++11)
Окружение чисел с плавающей точкой — это набор поддерживаемых реализацией флагов состояния и режимов управления числами с плавающей точкой. Оно является локальным для потока. Каждый поток наследует начальное состояние своего окружения чисел с плавающей точкой от родительского потока. Операции с числами с плавающей точкой изменяют флаги состояния, чтобы указывать на аномальные результаты или вспомогательную информацию. Состояние режимов управления числами с плавающей точкой влияет на результаты некоторых операций с числами с плавающей точкой.
Доступ к окружению чисел с плавающей точкой и его изменение имеют смысл только тогда, когда поддерживается #pragma STDC FENV_ACCESS и установлено значение ON. В противном случае реализация может исходить из того, что режимы управления числами с плавающей точкой всегда имеют значения по умолчанию, а флаги состояния никогда не проверяются и не изменяются. На практике лишь немногие современные компиляторы, такие как HP aCC, Oracle Studio или IBM XL, явно поддерживают #pragma, однако большинство компиляторов всё же позволяют осмысленно обращаться к окружению чисел с плавающей точкой.
Типы
Определён в заголовочном файле <cfenv> |
|
|---|---|
|
fenv_t
(C++11) | тип, представляющий всё окружение чисел с плавающей точкой (псевдоним типа) |
|
fexcept_t
(C++11) | тип, представляющий совокупность всех флагов состояния чисел с плавающей точкой (псевдоним типа) |
Функции
|
(C++11) | сбрасывает указанные флаги состояния чисел с плавающей точкой (функция) |
|
(C++11) | определяет, какие из указанных флагов состояния чисел с плавающей точкой установлены (функция) |
|
(C++11) | вызывает указанные исключения чисел с плавающей точкой (функция) |
|
(C++11)(C++11) | копируют состояние указанных флагов состояния чисел с плавающей точкой из окружения или в окружение (функция) |
|
(C++11)(C++11) | получает или задаёт направление округления (функция) |
|
(C++11) | сохраняет или восстанавливает текущее окружение чисел с плавающей точкой (функция) |
|
(C++11) | сохраняет окружение, сбрасывает все флаги состояния и игнорирует все последующие ошибки (функция) |
|
(C++11) | восстанавливает окружение чисел с плавающей точкой и повторно вызывает ранее возникшие исключения (функция) |
Макросы
|
(C++11) | исключения чисел с плавающей точкой (константа-макрос) |
|
(C++11) | направление округления чисел с плавающей точкой (константа-макрос) |
|
(C++11) | окружение чисел с плавающей точкой по умолчанию (константа-макрос) |
Примечания
Исключения чисел с плавающей точкой не связаны с исключениями C++. Когда операция с числами с плавающей точкой вызывает исключение чисел с плавающей точкой, состояние окружения чисел с плавающей точкой изменяется; это можно проверить с помощью std::fetestexcept, однако в большинстве реализаций выполнение программы на C++ продолжается без прерывания.
Существуют расширения компиляторов, которые позволяют автоматически генерировать исключения C++ при возникновении исключения чисел с плавающей точкой:
- Функция GNU libc
feenableexcept()включает перехват исключений чисел с плавающей точкой, что приводит к генерации сигналаSIGFPE. Если использовался параметр компилятора-fnon-call-exceptions, обработчик этого сигнала может выбросить пользовательское исключение C++. - Функция MSVC
_control87()включает перехват исключений чисел с плавающей точкой, что приводит к генерации аппаратного исключения; его можно преобразовать в исключение C++ с помощью_set_se_translator.
См. также
Документация по C для Floating-point environment |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/fenv