36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
|
|
1 | |
СИ++ и контроль переполнения10.11.2011, 13:03. Показов 9571. Ответов 20
Метки нет (Все метки)
Можно ли как-нибудь в VS включить контроль переполнения при математических вычислениях? Чтоб, например, возникало исключение. Или это можно сделать только средствами ассемблера путём контроля флагов?
0
|
10.11.2011, 13:03 | |
Ответы с готовыми решениями:
20
Отслеживание переполнения Переполнения безопастны? Флаг переполнения Защита от переполнения |
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
|
|
10.11.2011, 14:32 | 3 |
-=ЮрА=-, как это может помочь при контроле выполнения математических операций?
0
|
Заблокирован
|
||||||
10.11.2011, 14:36 | 5 | |||||
2
|
Заблокирован
|
|
10.11.2011, 14:45 | 7 |
- очень просто например нам нужны целочисленные значения, выполняем расчёты с ними например считаем сумму ряда в double sum, а затем смотрим если величина суммы превосходит INT_MAX то выдаём сообщение о переполнении, если же нет то делаем int val = (int)sum Вобщем в стандартных типах можно реализовать всё даже для float лишь бы желание было...
константа INT_MAX и многие другие прописаны в limits.h Добавлено через 5 минут
0
|
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
|
|
10.11.2011, 14:49 | 9 |
2
|
10.11.2011, 15:00 | 10 | |||||
Сообщение было отмечено как решение
Решение
Net_Wanderer, да, поторопился. Извините.
Добавлено через 8 минут А если сделать шаблонную обёртку, то можно:
3
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
10.11.2011, 21:42 | 11 |
talis, разумеется, ведь шаблонная обёртка не подпадает под понятие "базовый тип"
0
|
Заблокирован
|
||||||
11.11.2011, 10:47 | 12 | |||||
- ниже простой код не требующий введения классов и преобразований к старшему типу данных, я написал лишь ветвь для сложения, но завершить алгоритм труда не составит(остаётся заполнить лишь 3 case в множественном выборе)
0
|
Заблокирован
|
||||||
11.11.2011, 12:57 | 15 | |||||
- что под этим подразумевалось, чем это не читаемое выражение?
Алгоритм просто не даст сложить неправильно и всё Кстати у вас же ещё ветвь проверки значения нужно здесь дописать , причём от моих условных операторов она абсолютно ничем отличаться не будет. Кроме того мой код потянет даже самый самый начинающий, обвёртка уже предполагает некоторых знаний Не по теме: В заключение вот тест Вашего алгоритма
0
|
11.11.2011, 13:03 | 16 | |||||
-=ЮрА=-, если вы внимательно посмотрите код обёртки, то увидите, что я не включал туда никакого контроля. Реально внутри обёртки должен быть код, подобный вашему (лучше, конечно, ассемблерный вариант). А использование её в программе сведётся как раз к выражениям вида
0
|
|
11.11.2011, 13:25
#17
|
Не по теме: - я поэтому и писал. , Замечание сделал на случай вдруг ТС ещё не имеет достаточного багажа знаний и напрямую попытается использовать ваш код, это не претензия к вам была:pardon:На счёт остального соглашусь, я делал под начинающего, у вас как должно быть в программе уже набившего руку программиста;)
1
|
Заблокирован
|
||||||
11.11.2011, 14:30 | 18 | |||||
talis, кстати говоря в чём смысл 44 строки в твоём листинге? там же built-in оператор используется, и как бы нельзя проверить переполнение, а то я уже было обрадовался
1
|
11.11.2011, 15:01 | 20 |
Сообщение было отмечено как решение
Решение
О каких переполнениях идёт речь?
Если речь идёт о целочисленных переполнениях, то в современных процессорах вроде бы нет возможности сделать так, чтобы возникало прерывание при переполнении. Возможно только пощупать соответствующие целочисленные флаги непосредственно после выполнения операции, а потому нужно весь кусок (который вычисляет операцию и вызывает прерывание) полностью писать на ассемблере Если же речь идёт о плавающих вычислениях, то оно как правило процессорами поддерживается, потому что прерывания требуются по стандарту ieee-754. Для этого есть стандартные функции типа http://linux.die.net/man/3/feenableexcept но они, насколько я знаю, входят в стандарт Си99
4
|
11.11.2011, 15:01 | |
11.11.2011, 15:01 | |
Помогаю со студенческими работами здесь
20
Ошибка переполнения массива Ошибка переполнения буфера Как отловить переполнения? Проверка переполнения double Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |