Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Division by zero. Как узнать произошло ли?


Автор: w1zard350 7.3.2010, 11:36
Здравствуйте!

Нашелся такой нубовский вопрос. Как узнать программно, произошло ли деление на ноль? Как обрабатывать ошибку, если пытаемся вычесть из корня квадратного отрицательное число я узнал, а вот как узнать деление, не нашел. 
Вот так для корня квадратного:
Код

#include <cerrno>

...
errno = 0;
sqrt(-1);
if(errno)
    cout << "error" << endl;

Это в самом простом варианте, которого мне хватает. Т.е. идея в том, что sqrt записывает в глобал вар значение ошибки. Это очень удобно. А есть подобное для деления на ноль?

Я просто не могу проверять конкретно функцию, знаменатель. Функцию вводит юзер с клавиатуры.
Спасибо.

Автор: w1zard350 7.3.2010, 11:57
Тю. Вроде как решил свою проблему =) Посидел вот только что и попытался понять, почему мой cout выводит inf. В его код не полез, просто подумал: если оно выводит inf, значит большое число  smile  Начал проверять на огромные числа, остановился на 1e+300. 

В инете начитался, что любой компилятор для С++ не воспринимает деление на ноль для вещественных чисел, т.к. это не есть ошибка. Просто возвращается большое число. Глупо и легко. Извините за беспокойство. smile 
Код

res = 1/0;
if(fabs(res) > 1e+300)
        cout << "division by zero" <<endl;


Автор: Annihilator 7.3.2010, 13:34
А может лучше как-то так:

Код

#include<float.h>

res = 1/0;
if(!_finite(res))
        cout << "division by zero" <<endl;

Автор: azesmcar 7.3.2010, 13:45
Цитата

If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable
values for its type, the behavior is undefined, unless such an expression is a constant expression
(5.19), in which case the program is illformed.
[Note: most existing implementations of C++ ignore integer
overflows. Treatment of division by zero, forming a remainder using a zero divisor, and all floating
point exceptions vary among machines, and is usually adjustable by a library function.
 ]

Проверяй сам, если надо бросай исключение.

Цитата(w1zard350 @  7.3.2010,  11:36 Найти цитируемый пост)
Я просто не могу проверять конкретно функцию, знаменатель. Функцию вводит юзер с клавиатуры.

Проверять можно всегда, с этим просто не может возникнуть проблем. В крайнем случае можно написать функцию для деления.
Код

template <typename T>
T div(T a, T b)
{
    if (b == 0)
        throw std::runtime_error("division by zero");
    return a / b;
}

что-то вроде этого.

Автор: xvr 7.3.2010, 16:29
'inf' - это не 'большое чесло'. Это одно из 2х специальных FP значений (второе - NaN)

Автор: Alek86 7.3.2010, 16:35
при делении на 0 целых чисел винда кидает SEH исключение
и еще
Код
1 / 0

это деление целых чисел, прога из второго поста должна падать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)