2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Нет try catch (C++)
Сообщение12.11.2011, 13:27 


30/10/09
26
Как можно проверить что покидалсa допустимый диапазон для выбран тип данных в
временные результаты? Можно поймать этих случаях без использования обработки исключений - try/catch?

Спасибо.

 Профиль  
                  
 
 Re: Нет try catch (C++)
Сообщение12.11.2011, 19:22 
Заслуженный участник


27/04/09
28128
А более понятно не распишете?

 Профиль  
                  
 
 Re: Нет try catch (C++)
Сообщение12.11.2011, 20:09 


30/10/09
26
My Russian is very bad, I know... I can understand Russian, but it's very hard for me to write.

Let's say that we have a class and some methods of that class. If we need to write some code for overloaded arithmetic operators, then for the division operator we have to take care for the division by zero and to handle that case. It can be done by exception handling.

Similary, if we have defined data type which we are using in our computation (let's say unsigned int), and during some computational task (it can have many steps) we have temporary results which are out of unsigned int range, e.g. -2147483647. Even if at the end, the result would definitely be in unsigned int (let's say that we have defined our functions to do that), because of previous, we need to take care of that strange case. So, how can we check for leaving the admissible range of the chosen data type in temporary results? Can we catch these cases without using exception handling (the main question)?

Thanks.
Спасибо.

 Профиль  
                  
 
 Re: Нет try catch (C++)
Сообщение12.11.2011, 23:17 
Заслуженный участник


27/04/09
28128
Конечно, можем. Но мы должны знать, в каком месте временные результаты могут выйти за границы диапазона, а в каком не могут. Например, при умножении. Если результат умножения сохранить в переменной типа signed long, то мы сможем довольно просто проверить, вышло ли значение за пределы unsigned int, простым сравнением с обоими границами. А если мы не можем найти такой объемлющий тип (например, умножаем два signed long), надо или проверять данные перед операцией (для умножения это, наверно, трудно, но есть и простые случаи), или как-то сравнивать результат с ними на корректность (например, после сложения с единицей целое число тогда ушло за диапазон, когда стало меньше своего предыдущего значения [или когда было равно максимальному для данного типа]. Примерно так же с разными вариациями можно с любым типом данных.

P. S. Надеюсь, для проверки деления на ноль вы исключения не использовали. Гораздо меньше возни с проверкой делителя на ноль на месте, разве нет? Исключения разве не используют в иных случаях?

 Профиль  
                  
 
 Re: Нет try catch (C++)
Сообщение15.11.2011, 20:19 
Заслуженный участник


26/07/09
1559
Алматы
2Solunac
In turn, my English is very bad but I hope that You will understand me.

Цитата:
So, how can we check for leaving the admissible range of the chosen data type in temporary results?

I think You have a few options. For example, You can rearrange your formula so that all the temporary values fall in some bounded range and therefore don't cause overflow. Imagine a ratio of two factorials, say; each factorial can achieve astronomical values but the ratio itself is equal to some relatively small number. Is it your case?

Another option is to predict the overflow in advance by analyzing differences between your values and the capacity of selected datatype. Let You have two (integer) variables int A and int B. How can you predict the overflow in the "enlarging" operation such as addition? Obviously, instead of writing absurd like try {int C=A+B;} catch(...) {} all that you need is to compare value of A to the largest possible value of type int and then compare this difference to the value of your second variable B (in other words, you need check whether current datatype provide enough room to contain additional data or not,) i.e. you can write something like bool OverflowFlag = (MAXINT-A) < B. (Of course, this example must be extended to handle signed numbers.)

Finally, it's possible to provide variables of some larger datatype, especially for temporary results. E.g. even if your function is just a map from int to int, You can define local variables as, say, long long int. :)

May be, in some cases, it's make sense to check the state of your hardware directly. I mean checking some specific hardware flags or something similar. But it's far from C++. :)

 Профиль  
                  
 
 Re: Нет try catch (C++)
Сообщение15.11.2011, 23:07 


30/10/09
26
Thanks to both of You. Спасибо.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group