|
|
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
Как можно определить переполнение при выполнении арифметических операций. Понятно, что при делении на 0 в С++ будет порождено исключение. А как отловить случай, когда происходит переполнение, т.е. результат не умещается в переменную. Например, если при суммировании INT16 результат уместиться в INT32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 15:00 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
try{....} ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 15:03 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 15:34 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
LeonMtry{....} Либо я чего-то не понял, либо не поняли меня. Меня не интересует, как отловить ситуацию с делением на 0 - это просто. Да и в моем случае try... не поможет. Я имел ввиду: unsigned int i1 = 0xFFFFFFFF; unsigned int i2 = 0xFFFFFFFF; unsigned int i3 = i1+i2; В i3 будет помещено значение FFFFFFFE, когда как правильным является 1FFFFFFFE Это правильно. Это произошло из-за переполнения. И это не вызывает исключения. Да и не должно. На асме это можно посмотреть соответсвующую установку флага процессора. Но в асм лезть не хочу. При вызове функций sin и т.п из math. можно сравнить взвращаемый результат с некоторым значением, если выполняется равенство - произошла переполнение. Кроме того, можно переопределить поведение, напрмер, порождать исключение, но такого богатства мне не надо. Мне бы просто узнать, что результат является математически ошибочным (не всегда это нежелательный эффект - часто работают в поле 2^32 таким способом.) PS Я специально использовал такой размер int, чтобы не советовали взять тип большей разрядности. В общем случае можно лишь утверждать соотношение sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long), причем разрядность каждого типа зависит как от компилятора, так и от системы (программно-аппаратной). И гарантировать чего-либо другого нельзя. Аналогична ситуация и с действительными числами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 15:57 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
ZrenBy http://www.firststeps.ru/mfc/steps/r.php?393 Пока я писал ранее, поступил ответ. Просто очень уж не хотелось вспоминать забытый асм. Потом, можно было бы эту К разместь глобально или статически. И потом, эта штука не сработает в примере i1+i2+i3+i4, если произойдет переполнение при первом или втором суммировании, а при третьем - нет. Флаги-то обрабатыаем(в примере) после последней операции, а изменяются они при каждой мат. операции. Втыкать проверку после каждого выражения, да еще и разбивать выражения на части - слишком уж для кучи существующего кода. Просто (так и сам камень отмечает, да и в фортране) определены след. правила Число + число = число или NaN(смотрим по флагам) Число +NaN = NaN + Число = NaN. Тогда результат(конечный) достаточно проверить на равенство NaN. Конечно, при этом теряется одно значение, обычно, наибольшее возможное. Решить-то это можно переопределением операторов +-/* для стандартных типов, только в стандарте написано, что делать это никак не разрешается. И мой компилер не пропускает - значит, в этом следует стандарту. PS Придется писать свой класс INT. И везде по тексту - заменить -(... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 16:10 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
Совсем забыл комментарий к коду по ссылке: Мы там суммируем в асме - то есть повторно выполняем операцию. Проще тогда сразу результат проверить (иногда требуется коррекция, но это - в асм, в камень) и в переменную-назначение писать. А то у меня софтина полчаса считает. С такой проверочкой - вдвое увеличивать время - тяжело. PS этому форуму не хватает возможности редактировать сообщения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 16:16 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
Отловить такое можно только отладчиком или сбрасыванием значений переменных в какой-нибудь лог.... Для случаев i1+i2+i3+i4 вполне достаточно чтобы хотя бы одно из слагаемых было максимально вместительного типа и компилятор сам сделает приведение типа для всех остальных слагаемых. А вот случай: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 18:04 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
Я может чего упускаю, но при суммировании чисел с разными знаками переаолнения не возникает. при суммировании двух положительных чисел если результат меньше хотя бы одного из слагаемых - было переполнение. при суммировании двух отрицательных чисел если результат больше хотя бы одного из слагаемых - было переполнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 19:30 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
MasterZiv при суммировании двух положительных чисел если результат меньше хотя бы одного из слагаемых - было переполнение. при суммировании двух отрицательных чисел если результат больше хотя бы одного из слагаемых - было переполнение. Да, действительно. Можно отловить. Но слишком уж много сравнивать прийдется, проще все же самому следить чтоб не было выхода за пределы разрядности. С другой стороны, а какие вообще могут быть задачи в которых надо складывать такие большие числа? Если уж возникает опасность переполнения, то обычно просто берут специальную мат-библиотеку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2006, 20:55 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
White Owl а какие вообще могут быть задачи в которых надо складывать такие большие числа? Например, расчет высыпаний высокоэнергичных частиц по всему шарику в период магнитной бури (или в спокойный период - не важно). Просто с фортране (в старом - вылетала программа), в новом, втыкается NaN. А тут вот захотелось кое-кому С++ попробовать. PS Придется-таки копать в сторону библиотек. PPS Или напишу собственные классы для стандартных типов (ведь такое и для чисел с плавающей точкой возможно), только тогда придется суммировать самому в асме - а как неохота. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2006, 10:15 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
Например, расчет высыпаний высокоэнергичных частиц по всему шарику в период магнитной бури (или в спокойный период - не важно). Ты навернае пирипутал друх, такие вещи в флоат считают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2006, 21:57 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
MasterZivТы навернае пирипутал друх, такие вещи в флоат считают. int я взял только для примера. Такое же перполнение происходит и с флоат (а еще extended и currency, просто смени типы в примере - увидишь ту же фишку). И его тоже можно отловить в асме. Хотя осталась у нас от одного человечка забавная рутина, считающая значения падения потенциала через полярную шапку в виде числитель/знаменатель(правда, в ней емкости int хватает), переводящая к флоат только окончательный результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2006, 16:44 |
|
||
|
Вопрос об отлове ошибок иат. операций в С/С++
|
|||
|---|---|---|---|
|
#18+
НУ дак ты ж сам сказал, что напишешь свой класс. ИМХО: не надо его называть int. Назови по-другому, например TNonOverfowedNumber :)) а то потом будешь искать ошипки.... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2006, 16:48 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33516464&tid=2032009]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
146ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 206ms |
| total: | 458ms |

| 0 / 0 |
