Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
#1

Обработка исключений - C++

09.06.2013, 17:00. Просмотров 904. Ответов 15
Метки нет (Все метки)

Уважаемые админы. Знаю, что о помощи надо просить, когда имеются хоть какие-то наработки. К сожалению, тему исключений мало разбирала. А написать программу нужно на завтра-послезавтра.Вот задание:
Опишите функцию деления двух чисел с плавающей запятой, обработайте ошибку переполнения снизу (underflow).

Заранее благодарю.
p.s. Пишем в среде Qt.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2013, 17:00     Обработка исключений
Посмотрите здесь:

Обработка исключений - C++
что то я не пойму а что в плюсах нельзя разве сделать что то типа: try { ... } catch (int) { ... }

Обработка исключений - C++
Почему не перехватывает ошибку и не выводит Error? а прога сама прекращает работу. #include <iostream> using namespace std; ...

Обработка исключений - C++
Как в блоке Try...Catch... обработать необработанное исключение по адресу? Что необходимо использовать в параметрах catch?

Обработка исключений - C++
Есть вопрос по заданию. С клавиатуры вводится номер ошибочной ситуации. В зависимости от того, какой номер введен, сгенерировать...

обработка исключений - C++
Есть вот такой код: #include <iostream> #include <fstream> using namespace std; int _tmain(int argc, _TCHAR* argv) { ...

Обработка исключений - C++
Ребят, всем привет) помогите разобраться с вроде как простой задачкой, но весьма затруднительной для меня) По исключениям инфы мало в...

Обработка исключений - C++
Программа должна содержать блоки try, catch, точку throw. Задание: Ввод пользователем отрицательного возраста.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
09.06.2013, 17:28     Обработка исключений #2
то?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <stdexcept>
#include <limits>
 
using namespace std;
 
double div(double a, double b) throw(underflow_error)
{
    double result = a / b;
    if ( result < numeric_limits<double>::min() )
        throw underflow_error("underflow!");
    return result;
}
 
int main()
{
    try {
        div(numeric_limits<double>::min(), numeric_limits<double>::max());
    } catch (const exception &e) {
        cout << e.what();
    }
    return 0;
}
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
09.06.2013, 21:06  [ТС]     Обработка исключений #3
Вроде бы по коду похоже.Попозже скомпилю и гляну, как работает. Спасибо большое.

Добавлено через 55 минут
Я вот что еще хотела уточнить. Я думала, что переполнением снизу - это когда число получается слишком маленькое(т.е. имеет большое количество цифр после запятой и первые числа-это нули), и вследствие того, что оно может не влезть в раздел памяти, выделенный под double(например), оно усекается, и в итоге наше число получается равным 0. (такую суть объяснили преподаватели)
А в интернете прочитала, что у каждого ПК есть свое минимальное число и свое максимальное число(т.е. я так поняла, они получаются с помощью numeric_limits<double>::min(), numeric_limits<double>::max. И если при делении число меньше минимального, то ошибка переполнения снизу, а если больше максимального-то сверху. Так?
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
09.06.2013, 21:36     Обработка исключений #4
Цитата Сообщение от Olivеr Посмотреть сообщение
C++
1
2
double result = a / b;
if ( result < numeric_limits<double>::min() )


Добавлено через 8 минут
Olivеr, здравый смысл подсказывает, что это условие вообще не должно выполняться, иначе нахрена вообще нужно numeric_limits<double>::min(), если при этом переменная double хранит меньшее число?))) Бред какой-то, либо я переработал и пора в отпуск.
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
09.06.2013, 21:40  [ТС]     Обработка исключений #5
Цитата Сообщение от ITcrusader Посмотреть сообщение


Добавлено через 8 минут
Olivеr, здравый смысл подсказывает, что это условие вообще не должно выполняться, иначе нахрена вообще нужно numeric_limits<double>::min(), если при этом переменная double хранит меньшее число?))) Бред какой-то, либо я переработал и пора в отпуск.
Объясните может вы мне тогда, что от меня требуется написать по заданию. Алгоритм, что нужно проверять и что представляет ошибка.
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 21:44     Обработка исключений #6
Быть может так:
a / b < limits_min (домножим на b)
a < limits_min * b.

Просто немного изменить.
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
09.06.2013, 21:51     Обработка исключений #7
ITcrusader, условие выполняется, http://ideone.com/JHCe1V
И еще я внес поправку в условие потому, что
Антипереполнение. Возникает тогда, когда результат слишком мал для его представления в формате приемника результата операции, но отличен от нуля.
C++
1
2
    double result = a / b;
    if ( a && result < numeric_limits<double>::min() )
Если 0 / 5, то антипереполнения нету
Кто знает, пожалуйста, проверьте
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
09.06.2013, 22:00     Обработка исключений #8
Цитата Сообщение от Olivеr Посмотреть сообщение
Возникает тогда, когда результат слишком мал для его представления в формате приемника результата операции, но отличен от нуля.
Ну! Так приемник результата - double! Коль уж результат настолько мал, что не представим в виде double, как можно пользоваться оной переменной?
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
09.06.2013, 22:16     Обработка исключений #9
ITcrusader, Вы хотите сказать, что нужно сделать так?
C++
1
if ( a && (a / b) < numeric_limits<double>::min() )
Что Вы имели в виду под " как можно пользоваться оной переменной?" ? Никак не могу вкурить.
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 22:23     Обработка исключений #10
Olivеr, вероятно, он хотел сказать вот что:
у нас есть предельный минимум для чисел double, который хранится в таком же типе - double. При делении может получиться так, что результат меньше, чем самое минимальное значение для переменных типа double, но мы этого узнать не сможем, т.к. минимальное число, которое можно представить в типе double - это само минимальное значение.
MrGluck
Модератор
Эксперт CЭксперт С++
7184 / 4350 / 634
Регистрация: 29.11.2010
Сообщений: 11,843
09.06.2013, 22:24     Обработка исключений #11
ITcrusader, рекомендую ознакомиться и причаститься
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
09.06.2013, 22:30     Обработка исключений #12
Цитата Сообщение от Dani Посмотреть сообщение
Olivеr, вероятно, он хотел сказать вот что:
у нас есть предельный минимум для чисел double, который хранится в таком же типе - double. При делении может получиться так, что результат меньше, чем самое минимальное значение для переменных типа double, но мы этого узнать не сможем, т.к. минимальное число, которое можно представить в типе double - это само минимальное значение.
Спасибо за разъяснения. Это я знаю. Не мог понять, что же хотел сказать ITcrusader.

Взгляните на код:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <limits>
 
int main()
{
    double max = std::numeric_limits<double>::max();
    double min = std::numeric_limits<double>::min();
    if ( min / max < min ) std::cout << "undeflow??";
    return 0;
}
И на результат: http://ideone.com/QA0IqU

Получается, что мы все таки можем определить антипереполнение?
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 23:29     Обработка исключений #13
Olivеr,
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <limits>
 
int main()
{
    double max = std::numeric_limits<double>::max();
        double min = std::numeric_limits<double>::min();
        //if ( 5 < min ) std::cout << "undeflow??";
    std::cout << min/max;
    return 0;
}
Этот код выводит 0, потому что результат настолько мал получается, что он вылетает за точность. Отсюда получается настолько малое число, что не влазит в точность double. Отсюда 0, отсюда и то, что 0 меньше чем std::numeric_limits<double>::min()

Добавлено через 4 минуты
Походу, можно переполнение вниз определить так, если я все понял:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
int main()
{
    double a, b, c;
    std:: cin >> a >> b;
 
    if (!b)
        std::cout << "On zero divide!";
    else
    {
       c = a/b; 
       if (a == 0 || c) 
        std::cout << "Everything is going to be ok";
       else
        std::cout << "Underflow!";
    } 
}
Добавлено через 52 секунды
В этом коде: неприлично маленькое число принимается как 0 из-за потери точности, здесь и можно выявить underflow по ходу.
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 831
09.06.2013, 23:33     Обработка исключений #14
Цитата Сообщение от Dani Посмотреть сообщение
Этот код выводит 0, потому что результат настолько мал получается, что он вылетает за точность. Отсюда получается настолько малое число, что не влазит в точность double. Отсюда 0, отсюда и то, что 0 меньше чем std::numeric_limits<double>::min()
то есть антипереполнение можно выявить примерно вот так?
C++
1
2
3
4
5
6
7
double _div(double a, double b) throw(underflow_error)
{
    double result = a / b;
    if (a && result == 0.0)
        throw underflow_error("underflow!");
    return result;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2013, 23:35     Обработка исключений
Еще ссылки по теме:

Обработка исключений - C++
класс B является производным от абстрактного класса А. Определить обработчик исключительной ситуации при преобразовании указателя на класс...

Обработка исключений - C++
Здравствуйте! Есть вот такое выражение: Подскажите пожалуйста, как правильно реализовать обработку исключений. И у меня не...

Обработка исключений - C++
Здравствуйте, мне нужно проанализировать ведённый номер телефона методом обработка исключений. Подскажите пожалуйста, почему я не могу...

Обработка исключений - C++
Добрый день! Столкнулся с такой проблемой. У меня есть класс class MyClass { public: MyClass(/* какие то параметры*/); ...

Обработка исключений - C++
Проблема. В main создаю объект класса MAS int или string. Нужно, что бы когда int - то заполнялся массив нулями, а когда string -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dani
1300 / 637 / 56
Регистрация: 11.08.2011
Сообщений: 2,280
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 23:35     Обработка исключений #15
теоретически - да
Yandex
Объявления
09.06.2013, 23:35     Обработка исключений
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru