powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос об отлове ошибок иат. операций в С/С++
13 сообщений из 13, страница 1 из 1
Вопрос об отлове ошибок иат. операций в С/С++
    #33516290
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно определить переполнение при выполнении арифметических операций. Понятно, что при делении на 0 в С++ будет порождено исключение. А как отловить случай, когда происходит переполнение, т.е. результат не умещается в переменную. Например, если при суммировании INT16 результат уместиться в INT32.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33516308
LeonM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
try{....}
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33516464
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33516573
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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), причем разрядность каждого типа зависит как от компилятора, так и от системы (программно-аппаратной). И гарантировать чего-либо другого нельзя. Аналогична ситуация и с действительными числами.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33516617
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenBy http://www.firststeps.ru/mfc/steps/r.php?393
Пока я писал ранее, поступил ответ. Просто очень уж не хотелось вспоминать забытый асм. Потом, можно было бы эту К разместь глобально или статически.

И потом, эта штука не сработает в примере i1+i2+i3+i4, если произойдет переполнение при первом или втором суммировании, а при третьем - нет. Флаги-то обрабатыаем(в примере) после последней операции, а изменяются они при каждой мат. операции.
Втыкать проверку после каждого выражения, да еще и разбивать выражения на части - слишком уж для кучи существующего кода.

Просто (так и сам камень отмечает, да и в фортране) определены след. правила
Число + число = число или NaN(смотрим по флагам)
Число +NaN = NaN + Число = NaN.

Тогда результат(конечный) достаточно проверить на равенство NaN. Конечно, при этом теряется одно значение, обычно, наибольшее возможное.

Решить-то это можно переопределением операторов +-/* для стандартных типов, только в стандарте написано, что делать это никак не разрешается. И мой компилер не пропускает - значит, в этом следует стандарту.
PS
Придется писать свой класс INT. И везде по тексту - заменить -(...
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33516646
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем забыл комментарий к коду по ссылке:
Мы там суммируем в асме - то есть повторно выполняем операцию. Проще тогда сразу результат проверить (иногда требуется коррекция, но это - в асм, в камень) и в переменную-назначение писать.
А то у меня софтина полчаса считает. С такой проверочкой - вдвое увеличивать время - тяжело.
PS
этому форуму не хватает возможности редактировать сообщения.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33517042
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отловить такое можно только отладчиком или сбрасыванием значений переменных в какой-нибудь лог....

Для случаев i1+i2+i3+i4 вполне достаточно чтобы хотя бы одно из слагаемых было максимально вместительного типа и компилятор сам сделает приведение типа для всех остальных слагаемых.

А вот случай:
Код: plaintext
1.
2.
unsigned int i1 = 0xFFFFFFFF;
unsigned int i2 = 0xFFFFFFFF;
unsigned int i3 = i1+i2;
Отловить автоматически никак невозможно. Впрочем, не думаю что это такая уж большая проблема, мне за много-много лет она ни разу не попадалась, а вот использовал я сам такие переполнения довольно часто :)
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33517365
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я может чего упускаю, но
при суммировании чисел с разными знаками переаолнения не возникает.

при суммировании двух положительных чисел если результат меньше хотя бы одного из слагаемых - было переполнение.

при суммировании двух отрицательных чисел если результат больше хотя бы одного из слагаемых - было переполнение.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33517541
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv при суммировании двух положительных чисел если результат меньше хотя бы одного из слагаемых - было переполнение.

при суммировании двух отрицательных чисел если результат больше хотя бы одного из слагаемых - было переполнение.
Да, действительно. Можно отловить. Но слишком уж много сравнивать прийдется, проще все же самому следить чтоб не было выхода за пределы разрядности.
С другой стороны, а какие вообще могут быть задачи в которых надо складывать такие большие числа? Если уж возникает опасность переполнения, то обычно просто берут специальную мат-библиотеку.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33518077
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl а какие вообще могут быть задачи в которых надо складывать такие большие числа?
Например, расчет высыпаний высокоэнергичных частиц по всему шарику в период магнитной бури (или в спокойный период - не важно).

Просто с фортране (в старом - вылетала программа), в новом, втыкается NaN. А тут вот захотелось кое-кому С++ попробовать.

PS
Придется-таки копать в сторону библиотек.
PPS
Или напишу собственные классы для стандартных типов (ведь такое и для чисел с плавающей точкой возможно), только тогда придется суммировать самому в асме - а как неохота.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33520411
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, расчет высыпаний высокоэнергичных частиц по всему шарику в период магнитной бури (или в спокойный период - не важно).

Ты навернае пирипутал друх, такие вещи в флоат считают.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33522691
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТы навернае пирипутал друх, такие вещи в флоат считают.
int я взял только для примера. Такое же перполнение происходит и с флоат (а еще extended и currency, просто смени типы в примере - увидишь ту же фишку). И его тоже можно отловить в асме. Хотя осталась у нас от одного человечка забавная рутина, считающая значения падения потенциала через полярную шапку в виде числитель/знаменатель(правда, в ней емкости int хватает), переводящая к флоат только окончательный результат.
...
Рейтинг: 0 / 0
Вопрос об отлове ошибок иат. операций в С/С++
    #33522704
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НУ дак ты ж сам сказал, что напишешь свой класс.

ИМХО: не надо его называть int. Назови по-другому, например TNonOverfowedNumber :)) а то потом будешь искать ошипки....
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос об отлове ошибок иат. операций в С/С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]