Защита от переполнения типа данных

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Защита от переполнения типа данных

Сообщение BamsikPotapov » 22.03.2012 21:38:47

В результате математических операций у меня возникла ситуация что можно в программе ввести к примеру значение 50000 и программа пытается найти гиперболический тангенс этого аргумента. Возникает ошибка (SIGFPE External) как можно от этого защититься.
Первая идея у меня возникла просто проверить аргумент на значение.
Вторая это самому обработать исключение и действие на него, но как к нему подойти не знаю. Ведь мне нужно будет понять переполнение произошло или нет. Да и книга которую я прочитал сильно не помогла.
Если я напишу

try моя операция вычисления
except
сбросить все нафиг
end

Я не знаю какой тип исключения отвечает за переполнение данных

Так будет правильно? или есть способ лучше.
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

Re: Защита от переполнения типа данных

Сообщение Sergei I. Gorelkin » 22.03.2012 22:01:43

Ну так напиши после except:
on e: exception do writeln(e.classtype);
и узнаешь тип того исключения, которое нужно ловить.

Потом, если в блоке try находится несложный код (например, вычисление одной формулы), то после нее можно тупо ловить все исключения без разбора.

Наконец, математические исключения управляются процедурой SetExceptionMask из модуля Math, ненужные можно "замаскировать", но при этом переполнения будут приводить к результатам Inf и/или NaN (бесконечность / не число).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Защита от переполнения типа данных

Сообщение BamsikPotapov » 22.03.2012 23:09:54

Сергей спасибо. но еще добавлю для некоторых. Лазарус змеюка во время своей работы сам исключения обрабатывает, когда я его закрыл и запустил мой исполняемый файл все сработало как надо. Ну естественно я решил что не буду лезть в типы исключений и буду отлавливать всё и выполнять сброс.
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

Re: Защита от переполнения типа данных

Сообщение BamsikPotapov » 24.03.2012 16:23:16

При работе программы под Windows у меня проблем нет, при математических операциях идет олов ислючений try .... except ... end
Сегодня установил Linux Ubuntu и там исключения отлавливает система. Как справиться с этим я не понял. Подскажите как быть?
Можно поменять чтобы исключения отлавливала программа, а не операционная система?
Ислючения ловлю все, никакой конкретно тип мне не нужен.
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

Re: Защита от переполнения типа данных

Сообщение Ism » 24.03.2012 16:30:36

Вообще это странно. Или надо ловить исключения другим способом или тупо не допускать ошибочных аргументов . Возможно существуют другие методы вычислений формул , где исключения обрабатываются правильно.

А вообще лучше выложить пример проекта с ошибкой.
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Защита от переполнения типа данных

Сообщение BamsikPotapov » 24.03.2012 16:45:40

Простите сам накосячил, ошибка немного иная, виртуальная машина в маленьком окне открыта была не разглядел строку.
Linux ругался на Str(a:2:5,s);
a число
s переменная типа string
он в этом проблему находил Floating point overflow, просто в винде эта штука никогда не жаловалась, так я на неё и внимания не обращал. Может она в Linux по иному работает, всмысле макмильно возможных обрабатываемых значений.
Я добавил и эту строку в обработку исключений и все пошло
Еще раз извиняюсь
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

Re: Защита от переполнения типа данных

Сообщение Sergei I. Gorelkin » 24.03.2012 20:57:31

Возможно, проявляется нюанс поведения x87: математическое исключение может бросаться не на той машинной инструкции, которая его реально вызывает, а на следующей инструкции fpu, которая вполне может оказаться и в другой процедуре.

Str() сама по себе не должна бросать исключений.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Защита от переполнения типа данных

Сообщение BamsikPotapov » 24.03.2012 21:19:33

Нефига не понятно, подробней напиши.
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 239

Рейтинг@Mail.ru