Плавающая точка
Плавающая точка — это набор флагов состояния плавающей точки и режимов управления, поддерживаемых реализацией. Она локальна для потока. Каждый поток наследует начальное состояние своей среды плавающей точки от родительского потока. Операции с плавающей точкой изменяют флаги состояния плавающей точки, чтобы указать на аномальные результаты или вспомогательную информацию. Состояние режимов управления плавающей точкой влияет на результаты некоторых операций с плавающей точкой.
Доступ к среде плавающей точки и ее модификация имеют смысл только при поддержке #pragma STDC FENV_ACCESS и установлено значение ON. В противном случае реализация может предположить, что режимы управления плавающей точкой всегда являются значениями по умолчанию, и что флаги состояния плавающей точки никогда не проверяются или не изменяются. На практике немногие современные компиляторы, такие как HP aCC, Oracle Studio или IBM XL, явно поддерживают #pragma , но большинство компиляторов тем не менее позволяют осмысленно обращаться к среде плавающей точки.
Типы
Определено в заголовочном файле <cfenv> |
|
|---|---|
fenv_t | Тип, представляющий всю среду плавающей точки |
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++. Когда операция с плавающей точкой вызывает исключение плавающей точки, состояние среды плавающей точки изменяется, что можно проверить с помощью 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/w/cpp/numeric/fenv