Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

Обработка исключений - C++
Добрый вечер. Нужно обработать 5 исключений, я 3 обработал(и то мб неверно), а другие не могу придумать пока. Вот код: #include...

Обработка исключений - C++
Нужно описать класс исключения и программу, способную генерировать и обрабатывать исключение (должна содержать блоки try, catch, throw)....

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

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

Обработка исключений - C++
Доброго времени суток. Использую RAD XE 4. Пытаюсь поймать исключения путем catch(Exeption &E) { } Но компилятор...

15
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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;
}
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. И если при делении число меньше минимального, то ошибка переполнения снизу, а если больше максимального-то сверху. Так?
0
ITcrusader
Эксперт С++
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 хранит меньшее число?))) Бред какой-то, либо я переработал и пора в отпуск.
1
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
09.06.2013, 21:40  [ТС] #5
Цитата Сообщение от ITcrusader Посмотреть сообщение


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

Просто немного изменить.
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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, то антипереполнения нету
Кто знает, пожалуйста, проверьте
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
09.06.2013, 22:00 #8
Цитата Сообщение от Olivеr Посмотреть сообщение
Возникает тогда, когда результат слишком мал для его представления в формате приемника результата операции, но отличен от нуля.
Ну! Так приемник результата - double! Коль уж результат настолько мал, что не представим в виде double, как можно пользоваться оной переменной?
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
09.06.2013, 22:16 #9
ITcrusader, Вы хотите сказать, что нужно сделать так?
C++
1
if ( a && (a / b) < numeric_limits<double>::min() )
Что Вы имели в виду под " как можно пользоваться оной переменной?" ? Никак не могу вкурить.
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,290
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 22:23 #10
Olivеr, вероятно, он хотел сказать вот что:
у нас есть предельный минимум для чисел double, который хранится в таком же типе - double. При делении может получиться так, что результат меньше, чем самое минимальное значение для переменных типа double, но мы этого узнать не сможем, т.к. минимальное число, которое можно представить в типе double - это само минимальное значение.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7492 / 4607 / 693
Регистрация: 29.11.2010
Сообщений: 12,602
09.06.2013, 22:24 #11
ITcrusader, рекомендую ознакомиться и причаститься
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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

Получается, что мы все таки можем определить антипереполнение?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,290
Записей в блоге: 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 по ходу.
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
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;
}
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,290
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 23:35 #15
теоретически - да
0
09.06.2013, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2013, 23:35
Привет! Вот еще темы с ответами:

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

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

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

Обработка исключений - C++
Надо отловить ввод данных некорректного типа. Объясните пожалуйста на конкретном примере, как это правильно сделать. #include...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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