В версии С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 в положение "включено". Разрешен ли доступ к этим флагам по умолчанию, зависит от конкретной реализации.
Функция | Назначение |
---|---|
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() |