Сообщение Re: Обработка исключений FPU на C++ от 17.11.2024 16:58
Изменено 17.11.2024 17:07 kov_serg
Re: Обработка исключений FPU на C++
Здравствуйте, Vaynamond, Вы писали:
V>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ?
V>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы.
V>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?
https://en.cppreference.com/w/cpp/numeric/math/isfinite
https://en.cppreference.com/w/cpp/numeric/math/isinf
https://en.cppreference.com/w/cpp/numeric/math/isnan
V>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ?
V>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы.
V>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?
https://en.cppreference.com/w/cpp/numeric/math/isfinite
https://en.cppreference.com/w/cpp/numeric/math/isinf
https://en.cppreference.com/w/cpp/numeric/math/isnan
Re: Обработка исключений FPU на C++
Здравствуйте, Vaynamond, Вы писали:
V>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ?
V>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы.
V>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?
https://en.cppreference.com/w/cpp/numeric/math/isfinite
https://en.cppreference.com/w/cpp/numeric/math/isinf
https://en.cppreference.com/w/cpp/numeric/math/isnan
V>Гуру, подскажите пожалуйста, как правильно под Windows отлавливать исключения FPU на C/C++ ?
V>Пытаюсь с помощью SEH — целочисленное деление на 0 отлавливает, а double не хочет. Т.е. EXCEPTION_FLT_DIVIDE_BY_ZERO вообще мимо кассы.
V>Можно, конечно, проверять _statusfp(), и это срабатывает, но зачем тогда EXCEPTION_FLT_* ?
https://en.cppreference.com/w/cpp/numeric/math/isfinite
https://en.cppreference.com/w/cpp/numeric/math/isinf
https://en.cppreference.com/w/cpp/numeric/math/isnan
#include <cmath>
#include <iostream>
double divide(double a,double b) {
double r=a/b;
if (!std::isfinite(r)) throw std::overflow_error("Divide by zero exception");
return r;
}
int main(int argc, char const *argv[]) {
try {
double z=divide(1,0);
} catch(std::overflow_error e) {
std::cerr<<"ERROR: "<<e.what()<<std::endl;
}
return 0;
}