Информация об изменениях

Сообщение Re: Обработка исключений FPU на C++ от 17.11.2024 16:58

Изменено 17.11.2024 17:09 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

#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;
}
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

#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;
}


ps: А вы попробуйте целочисленное деление в linux отловить с помощью исключений