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

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

Восстановить пароль Регистрация
 
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
09.06.2013, 17:00     Обработка исключений #1
Уважаемые админы. Знаю, что о помощи надо просить, когда имеются хоть какие-то наработки. К сожалению, тему исключений мало разбирала. А написать программу нужно на завтра-послезавтра.Вот задание:
Опишите функцию деления двух чисел с плавающей запятой, обработайте ошибку переполнения снизу (underflow).

Заранее благодарю.
p.s. Пишем в среде Qt.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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++
 Аватар для 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 хранит меньшее число?))) Бред какой-то, либо я переработал и пора в отпуск.
Дев4енка
0 / 0 / 0
Регистрация: 26.03.2011
Сообщений: 85
09.06.2013, 21:40  [ТС]     Обработка исключений #5
Цитата Сообщение от ITcrusader Посмотреть сообщение


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

Просто немного изменить.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
09.06.2013, 22:00     Обработка исключений #8
Цитата Сообщение от Olivеr Посмотреть сообщение
Возникает тогда, когда результат слишком мал для его представления в формате приемника результата операции, но отличен от нуля.
Ну! Так приемник результата - double! Коль уж результат настолько мал, что не представим в виде double, как можно пользоваться оной переменной?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
09.06.2013, 22:16     Обработка исключений #9
ITcrusader, Вы хотите сказать, что нужно сделать так?
C++
1
if ( a && (a / b) < numeric_limits<double>::min() )
Что Вы имели в виду под " как можно пользоваться оной переменной?" ? Никак не могу вкурить.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 22:23     Обработка исключений #10
Olivеr, вероятно, он хотел сказать вот что:
у нас есть предельный минимум для чисел double, который хранится в таком же типе - double. При делении может получиться так, что результат меньше, чем самое минимальное значение для переменных типа double, но мы этого узнать не сможем, т.к. минимальное число, которое можно представить в типе double - это само минимальное значение.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
09.06.2013, 22:24     Обработка исключений #11
ITcrusader, рекомендую ознакомиться и причаститься
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 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
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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;
}
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
09.06.2013, 23:35     Обработка исключений #15
теоретически - да
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2013, 23:36     Обработка исключений
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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!";
    } 
}
У Вас аналогичный код. Ну наконец-то я понял
Yandex
Объявления
09.06.2013, 23:36     Обработка исключений
Ответ Создать тему
Опции темы

Текущее время: 12:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru