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 Этот способ кажется проще, но в нем есть условности и подводные камни, так что я его не стал бы рекомендовать. И вообще, хотя я все это и написал, рекомендую я все же вернуться к первоначальной идее и выполнить контроль за ошибками -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
-flover- Обработка ошибок 5.12.2007 16:52
andriano
Конечно, есть. И конечно, не такой, как у andria… 6.12.2007 12:00
Lapp Если не брать эксперименты из теории чисел, то люб… 6.12.2007 12:23
Flover
К сожалению задача это предполагает и, если делат… 6.12.2007 18:26
andriano
К сожалению задача это предполагает и, если делат… 8.12.2007 1:51
Flover
Да, использовать асм умнее. Ток вычесть 16383, и … 9.12.2007 20:44
andriano
Да, использовать асм умнее. Ток вычесть 16383, и … 9.12.2007 21:48
Flover Спасибо. А можно ли qw присвоить значение w[], что… 9.12.2007 22:48
andriano Конечно есть.
Если оба числа по модулю больше 10^1… 6.12.2007 3:05
volvo Правда? Ну, давай посмотрим:
Что я делаю не так?… 6.12.2007 3:12
volvo Надо точно? Тогда обрабатывай слово состояния FPU:… 6.12.2007 22:08
Flover Спасибо.. 7.12.2007 15:35
andriano Вот что у меня получилось:
var
e : extended;
… 9.12.2007 23:46
Flover Ага, надо было просто оперировать с w[], мог бы и … 10.12.2007 1:12![]() ![]() |
|
Текстовая версия | 23.12.2025 4:35 |