Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 85
1

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

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

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

Заранее благодарю.
p.s. Пишем в среде Qt.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2013, 17:00
Ответы с готовыми решениями:

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

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

Обработка исключений
Объясните мне толком для чего используются эти обработки исключений (Try, catch, throw). Сколько...

Обработка исключений
В задании функции должны генерировать подходящие исключения. Обработку исключений нужно выполнять...

15
413 / 409 / 95
Регистрация: 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
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 85
09.06.2013, 21:06  [ТС] 3
Вроде бы по коду похоже.Попозже скомпилю и гляну, как работает. Спасибо большое.

Добавлено через 55 минут
Я вот что еще хотела уточнить. Я думала, что переполнением снизу - это когда число получается слишком маленькое(т.е. имеет большое количество цифр после запятой и первые числа-это нули), и вследствие того, что оно может не влезть в раздел памяти, выделенный под double(например), оно усекается, и в итоге наше число получается равным 0. (такую суть объяснили преподаватели)
А в интернете прочитала, что у каждого ПК есть свое минимальное число и свое максимальное число(т.е. я так поняла, они получаются с помощью numeric_limits<double>::min(), numeric_limits<double>::max. И если при делении число меньше минимального, то ошибка переполнения снизу, а если больше максимального-то сверху. Так?
0
Эксперт С++
177 / 163 / 21
Регистрация: 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
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 85
09.06.2013, 21:40  [ТС] 5
Цитата Сообщение от ITcrusader Посмотреть сообщение


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

Просто немного изменить.
1
413 / 409 / 95
Регистрация: 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
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
09.06.2013, 22:00 8
Цитата Сообщение от Olivеr Посмотреть сообщение
Возникает тогда, когда результат слишком мал для его представления в формате приемника результата операции, но отличен от нуля.
Ну! Так приемник результата - double! Коль уж результат настолько мал, что не представим в виде double, как можно пользоваться оной переменной?
1
413 / 409 / 95
Регистрация: 06.10.2011
Сообщений: 832
09.06.2013, 22:16 9
ITcrusader, Вы хотите сказать, что нужно сделать так?
C++
1
if ( a && (a / b) < numeric_limits<double>::min() )
Что Вы имели в виду под " как можно пользоваться оной переменной?" ? Никак не могу вкурить.
0
1402 / 644 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
09.06.2013, 22:23 10
Olivеr, вероятно, он хотел сказать вот что:
у нас есть предельный минимум для чисел double, который хранится в таком же типе - double. При делении может получиться так, что результат меньше, чем самое минимальное значение для переменных типа double, но мы этого узнать не сможем, т.к. минимальное число, которое можно представить в типе double - это само минимальное значение.
0
Форумчанин
Эксперт CЭксперт С++
8161 / 5009 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
09.06.2013, 22:24 11
ITcrusader, рекомендую ознакомиться и причаститься
1
413 / 409 / 95
Регистрация: 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
1402 / 644 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
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
413 / 409 / 95
Регистрация: 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
1402 / 644 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
09.06.2013, 23:35 15
теоретически - да
0
413 / 409 / 95
Регистрация: 06.10.2011
Сообщений: 832
09.06.2013, 23:36 16
Цитата Сообщение от Dani Посмотреть сообщение
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!";
    } 
}
У Вас аналогичный код. Ну наконец-то я понял
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2013, 23:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Обработка исключений
Помогите написать программу пожалуйста!!!! Я незнаю как правильно написать!!! Задание: Для...

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

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

Обработка исключений
Здравствуйте, вопрос: В функцию передается ссылка на элемент массива, необходимо предусмотреть...


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

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

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