Как я могу вызвать исключение всякий раз, когда определенные математические значения установлены? - PullRequest
0 голосов
/ 04 ноября 2019

Мне нужно иметь возможность глобально останавливать выполнение моего кода C ++ всякий раз, когда установлены только определенные значения глобальной переменной errno (точнее, меня интересует только значение для ошибок домена EDOM).

Я видел, что библиотека math_errhandling позволяет использовать константу MATH_ERREXCEPT, чтобы автоматически выдавать ошибку для каждого вида математической ошибки.

В моем случае, язаинтересован в автоматическом повышении FE_INVALID для каждой ошибки домена, которая происходит в моем коде.

Однако мой код уже обрабатывает некоторые типологии математических ошибок, такие как ошибки деления на ноль. По этой причине автоматическое повышение значения FE_DIVBYZERO было бы совершенно нежелательным.

Существует ли практический способ добиться этого частичного повышения исключения с помощью math_errhandling или любой другой библиотеки C ++? Или, альтернативно, как я могу самостоятельно реализовать повышение исключений на основе проверки значения errno?

1 Ответ

1 голос
/ 04 ноября 2019

Я подозреваю, что вы ссылаетесь на math_errhandling из C ++. Это не библиотека, это константа, определяемая реализацией, которая сообщает вам , как реализация обрабатывает ошибки. Вы не можете изменить значение этой константы через C ++, хотя вы можете изменить ее значение с помощью определенных параметров компилятора (см. Документацию).

Несмотря на это, стандарт определяет только возможные значения MATH_ERRNO==1, MATH_ERREXCEPT==2 и (неявно) MATH_ERRNO | MATH_ERREXCEPT==3. Вы задаетесь вопросом о MATH_ERREXCEPT. Это просто означает, что вы можете звонить std::fetestexcept(FE_INVALID) после каждого звонка. Это не автоматическое throw реального исключения C ++, которое вы можете catch.

Основная проблема заключается в том, что C ++ на самом деле не соответствует современному оборудованию FP, которое ориентировано на вектор. Для высокопроизводительного кода компилятор объединит много операций, но модель исключений C ++ предполагает, что вы можете точно определить, какая операция завершилась неудачно. IEEE754 меньше страдает от этого, потому что имеет менее точную обработку ошибок. Использование NaN допускает больше параллелизма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...