Документация по LinuxLinuxDoc.Ru 🔍

feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv - обрабатывают ошибки и округляют числа с плавающей точкой (стандарт C99)

НАЗВАНИЕ
feclearexcept, fegetexceptflag, feraiseexcept, fesetex-
ceptflag, fetestexcept, fegetenv, fegetround, feholdex-
cept, fesetround, fesetenv, feupdateenv - обрабатывают
ошибки и округляют числа с плавающей точкой (стандарт C99)

СИНТАКСИС

#include

void feclearexcept(int excepts);
void fegetexceptflag(fexcept_t *flagp, int excepts);
void feraiseexcept(int excepts);
void fesetexceptflag(const fexcept_t *flagp, int excepts);
int fetestexcept(int excepts);

int fegetround(void);
int fesetround(int rounding_mode);

void fegetenv(fenv_t *envp);
int feholdexcept(fenv_t *envp);
void fesetenv(const fenv_t *envp);
void feupdateenv(const fenv_t *envp);

ОПИСАНИЕ
Эти 11 функций были определены в стандарте C99 и
предназначены для округления чисел с плавающей точкой и
обработки исключений (переполнения, деления на ноль и
т.п.).

Исключения
Исключение ДелениеНаНоль (DivideByZero) происходит при
операции над определенным числом в результате которой
получается неопределенный результат (бесконечность).

исключение переаолнения (Overflow) происходит когда
результат представлен числом с плавающей точкой и имеет
большее абсолютное значение чем может быть указано.

Исключение Underflow происходит когда результат
представлен числом с плавающей точкой и имеет меньшее
абсолютное значение чем может быть указано (а в
денормализованном виде не будет точным значением).

Исключение Inexact происходит когда округленный результат
операции теряет свою точность. Это может произойти и при
исключениях Overflow или Underflow.

Исключение Invalid когда нет определенного результата
операции, например при операциях 0/0 или бесконечность -
бесконечность или sqrt(-1).

Обработка ошибок
Ошибки могут быть представлены двумя способами: битом
(ошибка установлена/сброшена) или битами, позиция которых
в целом числе задается в зависимости от ее реализации, а
также структурой, в которой может быть приведена
дополнительная информация об ошибке (например, ее адрес).

Hижеприведенные макросы: FE_DIVBYZERO, FE_INEXACT,
FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW - определены, если
данная реализация поддерживает обработку соответствующих
ошибок. Соответствующие биты должны быть определены таким
образом, чтобы можно было вызвать функции обработки ошибок
с целочисленным аргументом, например, FE_OVER-
FLOW|FE_UNDERFLOW. Могут поддерживаться и другие ошибки.
Макрос FE_ALL_EXCEPT является результатом побитового
логического сложения всех битов, соответствующих
поддерживаемым ошибкам.

Функция feclearexcept сбрасывает поддерживаемые ошибки,
заданные битами в аргументе функции.

Функция fegetexceptflag заносит представление флагов
ошибок, указанных в аргументе excepts, в объект *flagp.

Функция feraiseexcept устанавливает поддерживаемые ошибки,
заданные битами в excepts.

Функция fesetexceptflag устанавливает значение полного
состояния ошибок, указанных в excepts, равным значению
*flagp. Это значение должно быть получено ранее с помощью
вызова fegetexceptflag, последний аргумент которого
содержит в excepts все биты.

Функция fetestexcept возвращает слово, в котором
установлены биты, указанные в аргументе excepts и для
которых в данный момент установлена соответствующая
ошибка.

Округление
Hижеприведенные макросы: FE_DOWNWARD, FE_TONEAREST,
FE_TOWARDZERO, FE_UPWARD - определены, если данная
реализация поддерживает считывание и установку
соответствующих направлений округления.

Функция fegetround возвращает макрос, соответствующий
текущему режиму округления.

Функция fesetround устанавливает режим округления в
соответствии с аргументом и возвращает ноль, если эта
операция была успешно выполнена.

Операций с плавающей точкой
Все операции с плавающей точкой, включая операции
управляющих режимов и флагов состояния, могут быть
обработаны как единый объект (окружение), имеющий тип
fenv_t. Окружение, используемое по умолчанию, определено
как FE_DFL_ENV (тип const fenv_t *).

Функция fegetenv сохраняет текущее окружение операций с
плавающей точкой в объекте *envp.

Функция feholdexcept делает то же самое, а затем
сбрасывает все флаги ошибок и устанавливает
безостановочный (продолжающий работу при возникновении
ошибок) режим, если таковой разрешен. При удачном
завершении функция возвращает нулевое значение.

Функция fesetenv восстанавливает окружение операций с
плавающей точкой из объекта *envp. Этот объект должен
быть заведомо правильным: например, быть результатом
вызова fegetenv, feholdexcept или быть эквивалентен
FE_DFL_ENV. Вызов этой функции не вызывает ошибок.

Функция feupdateenv устанавливает окружение для операций с
плавающей точкой представленное объектом *envp, за
исключением необработанных результатов (Исключения
см.выше). После выова этой функции все исключения , будут
побитно сложены с установленными ранее и находящимися в
*envp. Объект *envp должен быть корректным.


ДЕТАЛИ ВЕРСИИ GNU
По возможности GNU C Library определяет макрос
FE_NOMASK_ENV Вы можете проверить его используя #ifdef.
Он определен только в случае когда указано _GNU_SOURCE.
Стандарт C99 не определяет способ установки отдельных
битов в маске плавающей точки. glibc 2.2 поддерживает
функции feenableexcept и fedisableexcept для установки
ловушек для операций с плавающей точкой, и функцию fege-
texcept для опроса состояния.

int feenableexcept (int excepts);
int fedisableexcept (int excepts);
int fegetexcept (void);

Функции feenableexcept и fedisableexcept включают
(выключают) ловушки для каждого исключения excepts и
возвращают предыдущий набор исключений и -1 при ошибке.
Функция fegetexcept возвращает набор всех включенных
исключений.

СООТВЕТСТВИЕ
IEC 60559 (IEC 559:1989), ANSI/IEEE 854, ISO C99 (ISO/IEC
9899:1999). сохраняет обнаруженные в данный момент ошибки
в стеке, восстанавливает окружение операций с плавающей
точкой из объекта, на который указывает envp, а затем
восстанавливает сохраненные ошибки. Как и в предыдущих
случаях объект, на который указывает envp, должен быть
заведомо правильным.
Читать новости Linux в Telegram
Linux - feclearexcept, fegetexceptflag, feraiseexcept, fesetexceptflag, fetestexcept, fegetenv, fegetround, feholdexcept, fesetround, fesetenv, feupdateenv - обрабатывают ошибки и округляют числа с плавающей точкой (стандарт C99)
Мы в соцсетях ✉