Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ?
Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы.
Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?
Здравствуйте, Vaynamond, Вы писали:
V>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ? V>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы. V>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?
Здравствуйте, Zhendos, Вы писали:
Z>Здравствуйте, Vaynamond, Вы писали:
V>>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ?
Z>По идее с помощью
Z>
На MS VS 2010 такое не прокатывает, ругается на std::isfinite
Но это, по сути, аналог _statusfp() с последующим выбросом исключения С++. Такой вариант у меня есть, но ИМХО похоже на костыль.
Вопрос, почему EXCEPTION_FLT_* не срабатывают...
_>ps: А вы попробуйте целочисленное деление в linux отловить с помощью исключений
Про Linux не скажу, а на Windows EXCEPTION_INT_DIVIDE_BY_ZERO спокойно приходит.
Здравствуйте, Vaynamond, Вы писали:
V>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ? V>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы.
По умолчанию прерывания от плавающей точки замаскированы. Размаскировать можно используя _control87, _controlfp, __control87_2.
V>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?
В статье есть пример, когда деление на ноль, не выбрасывающее исключения, может быть полезным. Там же есть пример, как сделать чтобы выбрасывалось исключение. Код из статьи я не проверял.
Здравствуйте, cserg, Вы писали:
C>Здравствуйте, Vaynamond, Вы писали:
V>>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ? V>>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы. C>По умолчанию прерывания от плавающей точки замаскированы. Размаскировать можно используя _control87, _controlfp, __control87_2.
Огромное спасибо!
Я неправильно задал параметры для _controlfp.
V>>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ? C>В статье есть пример, когда деление на ноль, не выбрасывающее исключения, может быть полезным. Там же есть пример, как сделать чтобы выбрасывалось исключение. Код из статьи я не проверял.
Пример проверил на MSVS 2010, работает корректно.