Обработка ошибок |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Обработка ошибок |
-flover- |
Сообщение
#1
|
Гость |
Существует ли в паскале обработка ошибок, на подобии бейсиковской onerror?
|
volvo |
Сообщение
#2
|
Гость |
Встроенная (я про Турбо-Паскаль, конечно, современные-то компиляторы имеют блок Try ... Except) - нет, добавить можно (с использованием ассемблерных вставок или директивы Inline)... Пример - тут:
как отлавливать исключение в Турбо Паскале 7.0 |
Flover |
Сообщение
#3
|
Группа: Пользователи Сообщений: 6 Пол: Мужской Репутация: 0 |
Мде(
Может есть способ проверить перед умножением двух чисел extended, будет переполнение или нет? |
Lapp |
Сообщение
#4
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
есть способ проверить перед умножением двух чисел extended, будет переполнение или нет? Конечно, есть. И конечно, не такой, как у andriano. Проверка на уровне "возможно" вряд ли устроит в реальной ситуации (даже если не ошибиться в диапазоне )..Можно проверять логарифм. Как известно, логарифм произведения равен сумме логарифмов. Вычисли натуральные логарифмы модулей сомножителей и сложи их. Если получится меньше, чем примерно 11356.5 (значение можно уточнить, но это непринципиально), то смело умножай, если больше - то не стоит.. И есть еще одно "но": надо следить, чтоб никакой из сомножителей не был равен нулю, иначе логарифм выдаст ошибку. Но при хотя бы одном сомножителе, равном нулю, за переполнение произведения опасаться нечего, так что все в результате должно выглядеть примерно так: if (a=0) or (b=0) or (Ln(Abs(a))+Ln(Abs(b))<=11356.5) then c:=a*b; Если ты можешь приблизительно предсказать величину своих чисел, то можно обойтись без логарифмов. Например, если ты уверен, что все значения больше, скажем, единицы, то можно перемножить обратные величины. Это произведение нужно сравнить примерно с 5e-4932 : if 1/Abs(a)/Abs(b)>5e-4932 then c:=a*b Этот способ кажется проще, но в нем есть условности и подводные камни, так что я его не стал бы рекомендовать. И вообще, хотя я все это и написал, рекомендую я все же вернуться к первоначальной идее и выполнить контроль за ошибками . Подобные же извращения существено замедлят выполнение программы.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
andriano |
Сообщение
#5
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Конечно, есть. И конечно, не такой, как у andriano. Проверка на уровне "возможно" вряд ли устроит в реальной ситуации Не могу согласиться. Если не брать эксперименты из теории чисел, то любые величины, которые могут встретиться в РЕАЛЬНЫХ расчетах, никак не могут превосходить по абсолютной величине 10 в степени несколько десяков. Да и десятки в данном случае - большая экзотика. Поэтому появление ХОТЯ БЫ ОДНОГО числа больше, скажем, 10^154 уже однозначно свидетельствует об ошибке. Таким образом, если нас интересуют вычисления ради вычислений, можно, конечно, поизвращаться, если же нас интересует ответ на конкретный вопрос (решение конкретной задачи), то даже единственного сомножителя "неразумной" величины достаточно, чтобы сделать вывод о том, что в предшествующих вычислениях содержится ошибка? А зачем еще нам может понадобиться проверка? Только затем, чтобы выявить и аккуратно обработать ошибку вместо того, чтобы допусить аварийное завершение программы. PS. Ну не помню я навскидку пределы изменения extended. Казалось, что порядка 10^308. Возможно, это относится к какому-то другому типу. В любом случае, в реальных расчетах такие числа не используются. Сообщение отредактировано: andriano - |
Текстовая версия | 29.03.2024 0:15 |