Библиотека поддержки среды вычислений с плавающей точкой

Содержание

В версии С99 заголовком <fenv.h> объявляются функции, которые имеют доступ к среде вычислений с плавающей точкой. Эти функции описаны в табл. 20.2. Заголовок <fenv.h> также определяет типы fenv_t и fexcept_t, которые представляют конфигурацию вычислителя, реализующего среду вычислений с плавающей точкой и флаги состояния этого вычислителя соответственно. Макрос FE_DFL_ENV задает указатель на действующую по умолчанию конфигурацию вычислителя, реализующего среду вычислений с плавающей точкой, определенную при запуске программы.

Определены также следующие макросы исключений, возникающих при работе с числами с плавающей точкой:

FE_DIVBYZERO   FE_INEXACT     FE_INVALID
FE_OVERFLOW    FE_UNDERFLOW   FE_ALL_EXCEPT

Все комбинации этих макросов, полученные с помощью операции ИЛИ, можно сохранять в объекте типа int.

Определены также следующие макросы, используемые для указания направления округления значений:

FE_DOWNWARD   FE_TONEAREST   FE_TOWARDZERO   FE_UPWARD

Для проверки флагов вычислителя, реализующего среду вычислений с плавающей точкой, необходимо установить специальную директиву (прагму) для компилятора FENV_ACCESS в положение «включено». Разрешен ли доступ к этим флагам по умолчанию, зависит от конкретной реализации.




Таблица 20.2. Функции вычислителя, реализующего среду вычислений с плавающей точкой
ФункцияНазначение
void feclearexcept(
  int ex);

Сбрасывает исключения, заданные параметром ex
void fegetexceptflag(
  fexcept_t *fptr,
  int ex);

В переменной, адресуемой указателем fptr, сохраняет состояние флагов исключений вычислителя, реализующего среду вычислений с плавающей точкой, заданных параметром ex
void feraiseexcept(
  int ex);

Возбуждает исключения, заданные параметром ex
void fesetexceptflag(
  fexcept_t *fptr,
  int ex);

Устанавливает флаги состояния вычислителя, реализующего среду вычислений с плавающей точкой, заданные параметром ex, в состояние флагов, содержащихся в объекте, адресуемом параметром fptr
int fetestexcept(
  int ex);

Выполняет операцию поразрядного ИЛИ над флагами заданными параметром ex, и текущими флагами вычислителя, реализующего среду вычислений с плавающей точкой. Возвращает результат этой операции
int fegetround(
  void);

Возвращает значение действующего направления округления
int fesetround(
  int direction);

Устанавливает значение текущего направления округления с помощью параметра direction. При успешном выполнении возвращается нуль
void fegetenv(
  fenv_t *envptr);

В объект, адресуемый параметром envptr, записывается конфигурация вычислителя, реализующего среду вычислений с плавающей точкой
int feholdexcept(
  fenv_t *envptr);

Устанавливает безостановочную обработку исключения, возникшего при выполнении вычислений с плавающей точкой. Сохраняет конфигурацию вычислителя, реализующего среду вычислений с плавающей точкой, в переменной, адресуемой параметром envptr, и сбрасывает флаги состояния. При успешном выполнении возвращает нуль
void fesetenv(
  fenv_t *envptr);

Устанавливает конфигурацию вычислителя, реализующего среду вычислений с плавающей точкой, равной значению переменной, адресуемой параметром envptr, но исключения с плавающей точкой при этом не возбуждаются. Объект, адресуемый параметром envptr, должен быть получен в результате вызова функции fegetenv() или функции feholdexcept()
void feupdateenv(
  fenv_t *envptr);

Устанавливает конфигурацию вычислителя, реализующего среду вычислений с плавающей точкой, равной значению переменной, адресуемой параметром envptr. Сначала сохраняет любые текущие исключения, а затем, после установки конфигурации вычислителя в соответствии со значением переменной, адресуемой параметром envptr, возбуждает эти исключения. Объект, адресуемый параметром envptr, должен быть получен путем вызова функции fegetenv() или функции feholdexcept()