Spec-Zone.ru › C++

Плавающая точка

Плавающая точка — это набор флагов состояния плавающей точки и режимов управления, поддерживаемых реализацией. Она локальна для потока. Каждый поток наследует начальное состояние своей среды плавающей точки от родительского потока. Операции с плавающей точкой изменяют флаги состояния плавающей точки, чтобы указать на аномальные результаты или вспомогательную информацию. Состояние режимов управления плавающей точкой влияет на результаты некоторых операций с плавающей точкой.

Доступ к среде плавающей точки и ее модификация имеют смысл только при поддержке #pragma STDC FENV_ACCESS и установлено значение ON. В противном случае реализация может предположить, что режимы управления плавающей точкой всегда являются значениями по умолчанию, и что флаги состояния плавающей точки никогда не проверяются или не изменяются. На практике немногие современные компиляторы, такие как HP aCC, Oracle Studio или IBM XL, явно поддерживают #pragma , но большинство компиляторов тем не менее позволяют осмысленно обращаться к среде плавающей точки.

Типы

Определено в заголовочном файле <cfenv>
fenv_t Тип, представляющий всю среду плавающей точки
fexcept_t Тип, представляющий все флаги состояния плавающей точки коллективно

Функции

feclearexcept
(C++11)
очищает указанные флаги состояния плавающей точки
(функция)
fetestexcept
(C++11)
определяет, какие из указанных флагов состояния плавающей точки установлены
(функция)
feraiseexcept
(C++11)
вызывает указанные исключения плавающей точки
(функция)
fegetexceptflagfesetexceptflag
(C++11)(C++11)
копирует состояние указанных флагов состояния плавающей точки из или в среду плавающей точки
(функция)
fegetroundfesetround
(C++11)(C++11)
получает или устанавливает направление округления
(функция)
fegetenvfesetenv
(C++11)
сохраняет или восстанавливает текущую среду плавающей точки
(функция)
feholdexcept
(C++11)
сохраняет среду, очищает все флаги состояния и игнорирует все будущие ошибки
(функция)
feupdateenv
(C++11)
восстанавливает среду плавающей точки и вызывает ранее возникшие исключения
(функция)

Макросы

FE_ALL_EXCEPTFE_DIVBYZEROFE_INEXACTFE_INVALIDFE_OVERFLOWFE_UNDERFLOW
(C++11)
исключения плавающей точки
(макро-константа)
FE_DOWNWARDFE_TONEARESTFE_TOWARDZEROFE_UPWARD
(C++11)
направление округления плавающей точки
(макро-константа)
FE_DFL_ENV
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API