Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Division by zero. Как узнать произошло ли? 
:(
    Опции темы
w1zard350
Дата 7.3.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2009

Репутация: нет
Всего: нет



Здравствуйте!

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

#include <cerrno>

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

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

Я просто не могу проверять конкретно функцию, знаменатель. Функцию вводит юзер с клавиатуры.
Спасибо.
PM MAIL   Вверх
w1zard350
Дата 7.3.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 4.5.2009

Репутация: нет
Всего: нет



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

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

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



Это сообщение отредактировал(а) w1zard350 - 7.3.2010, 11:59
PM MAIL   Вверх
Annihilator
Дата 7.3.2010, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



А может лучше как-то так:

Код

#include<float.h>

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



--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
azesmcar
Дата 7.3.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

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

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

Это сообщение отредактировал(а) azesmcar - 7.3.2010, 13:46
PM   Вверх
xvr
Дата 7.3.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

PM MAIL   Вверх
Alek86
Дата 7.3.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



при делении на 0 целых чисел винда кидает SEH исключение
и еще
Код
1 / 0

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1040 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.