Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заставить отлавливать EUnderFlow, обработка исключительных ситуаций 
V
    Опции темы
zalex
Дата 31.3.2006, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.5.2005

Репутация: 2
Всего: 2



Почему то не возникает ИС при исчезновении порядка.Код следующий.

Код
procedure TForm1.Button12Click(Sender: TObject);

var
a,b,c:Single;

begin

try
a:=3e+38;
b:=3e+38;

c:=1/(a*b);
ShowMessage(FloatToStr©);
except
 on EInvalidOp do ShowMessage('EInvalidOp');
 on EOverflow do ShowMessage('Ïåðåïîëíåíèå');
 on EZeroDivide do ShowMessage('Äåëåíèå íà íîëü.');
 on EUnderFlow do ShowMessage('Ïîòåðÿ ïîðÿäêà');
 else ShowMessage('ÈÑ');
 end;

end;


Почему?
PM MAIL   Вверх
zalex
Дата 31.3.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.5.2005

Репутация: 2
Всего: 2



Рыл интернет по этому вопросу, кое чсто нашел - но понять это не могу. Мож кто подскажет? Насколько я понял, это разговор на С.

On most plattforms you need to activate FPU-Exceptions first. For windows
you need

_control87( 0, _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE | _EM_OVERFLOW |
_EM_UNDERFLOW);
_clearfp();

somewhere before you try to generate an exception.
PM MAIL   Вверх
Alexeis
Дата 31.3.2006, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



zalex, я думаю что функция FloatToStr "умная" и игнорирует некоторые символы.
нужно разделить пробелами ShowMessage(FloatToStr©); выражение.
Добавлено @ 14:09
А при копировании текста усанавливать язык русским тогда не будет проблем с коментариями smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 31.3.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(alexeis1 @ 31.3.2006, 14:07 Найти цитируемый пост)
zalex, я думаю что функция FloatToStr "умная" и игнорирует некоторые символы.

Какие смиволы она игнорирует? Ошибка должна возникать ещё раньше, при выполнении 12 строки.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 31.3.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Так все понято при вычислении c:=1/(a*b);
компилятор расширяет тип до extended (скорее это делает даже сопроцессор); и только потом результат урезает - поэтому результат вполне хороший.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zalex
Дата 31.3.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.5.2005

Репутация: 2
Всего: 2



Да, ошибка должна быть именно в 12 строке. Но её нет smile

Я вообще не могу создать случай, что бы возникла EUnderflow. А во многих статьях так всё просто написано, что порой мне кажется, я что то не догоняю, либо те, кто пишут эти статьи - чистые теоретики-переводчики smile
PM MAIL   Вверх
Alexeis
Дата 31.3.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



а у меня получилось smile
Код

procedure TForm1.Button2Click(Sender: TObject);
var
a,b,c:extended;
begin
try
 a:=1e+4932;
 b:=1e+4932;
 c:=1/(a*b);
 ShowMessage(FloatToStr(c));
except
 on EInvalidOp do ShowMessage('EInvalidOp');
 on EOverflow do ShowMessage('Ia?aiieiaiea');
 on EZeroDivide do ShowMessage('Aaeaiea ia iieu.');
 on EUnderFlow do ShowMessage('Iioa?y ii?yaea');
 else ShowMessage('EN');
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 31.3.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(alexeis1 @ 31.3.2006, 14:37 Найти цитируемый пост)
а у меня получилось

Мы тут за EUnderflow бьёмся вообщето smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
zalex
Дата 31.3.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.5.2005

Репутация: 2
Всего: 2



Ну да, а в коде Alexis1 Overflow возникает.
Кстати, пробовал
Код

SetExceptionMask(GetExceptionMask+[exUnderflow]);

тоже не помогает.
PM MAIL   Вверх
Alexeis
Дата 31.3.2006, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



тоже верно.
Вот что говорит справка
Цитата

When a floating-point math operation produces a value that is too small to be represented in a floating-point variable, the result ordinarily becomes zero. However, an application can change the numeric coprocessor's control word to unmask underflow hardware exceptions. In this case, EUnderflow is raised when the processor reports an underflow hardware exception.

вообщем для этого исключения нужно настроить какие-то флаги сопроцессора иначе результат будет нулевым


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zalex
Дата 31.3.2006, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.5.2005

Репутация: 2
Всего: 2



Дык пробовал выше SetExceptionMask и хоть бы что .
PM MAIL   Вверх
_hunter
Дата 31.3.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



еще Set8087CW есть...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
zalex
Дата 31.3.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 13.5.2005

Репутация: 2
Всего: 2



Вопрос решен.
Всё управляется
Код

SetExceptionMask(GetExceptionMask-[exUnderflow]);

Минус, а не плюс. Всем большое спаксибо. Сегодня я разобрался с ИС, возникающих при математических операциях. День, а точнее сутки прошли не зря.
Добавлено @ 18:51
Цитата(_hunter @ 31.3.2006, 16:18)
еще Set8087CW есть...

Ок, спасибо. Буду знать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1087 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.