IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Исключения FPU
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Создаю тут, потому что мне кажется, что это относится к асму.


{$APPTYPE CONSOLE}

var
a: extended;
begin
a := sqrt(-1);
writeln(a);
readln;
end.




Я хочу, чтобы это программа вывела на экран NAN. Меня вполне устраивает значение "не число". Неопределённый результат - тоже результат, что такого-то. Но программа вылетает. Причём вылет происходит не в момент вычисления корня, а при выгрузке результата в память. Что надо сделать, чтобы программа не вылетала? (Вариант writeln('NAN') - не предлагать).


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Ах, ты о том, что при использовании модуля OpenGL
uses OpenGL;

var
a, b: double;
begin
b := 0.0;
a := -1.23;
a := a / b;

writeln(a);
readln;
end.

выдает -Inf , а не выбрасывает исключение? Так, это само собой: в секции инициализации модуля OpenGL есть код, который устанавливает маску исключений. Что-то вроде
SetExceptionMask(
[exInvalidOp, exDenormalized, exZeroDivide,exOverflow, exUnderflow, exPrecision]
);

(то, что я привел - это из исходников FPC, в Дельфи тоже что-то подобное, но исходников его у меня сейчас нет под рукой).

Где
  TFPUException = (
exInvalidOp, exDenormalized, exZeroDivide,
exOverflow, exUnderflow, exPrecision);

TFPUExceptionMask = set of TFPUException;

function SetExceptionMask(const Mask: TFPUExceptionMask): TFPUExceptionMask;
var
CtlWord: Word;
begin
CtlWord := Get8087CW;
Set8087CW( (CtlWord and $FFC0) or Byte(Longint(Mask)) );
if has_sse_support then
SetSSECSR((GetSSECSR and $ffffe07f) or (dword(Mask) shl 7));
softfloat_exception_mask:=dword(Mask);
Result := TFPUExceptionMask(Longint(CtlWord and $3F));
end;

(а это - уже из модуля Math)

Так что не мудрено, что при использовании модуля OpenGL становится возможным деление на 0 (и многое другое). Только вот хорошо ли это? А если у меня написан код, когда я его писал - совершенно логично считал, что любая попытка делить что-либо на 0 закончится выбрасыванием исключения, ловил это исключение в блоке Except, а потом подключил модуль OpenGL, и вся логика улетела в тартарары, ни один блок Except не отработал, зато теперь результат содержит мне на фиг не нужное +/- (Inf).

"А?... Это хорошо? Это противно..." (С) А. Райкин, "Дефицит"...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
TarasBer   Исключения FPU   18.06.2010 14:20
volvo   Не имеет это никакого отношения к ассемблеру. И Де…   18.06.2010 15:26
TarasBer   Я в курсе про обработку исключений. Но в данном сл…   18.06.2010 15:49
volvo   Костыль будет, если отключить обработку исключения…   18.06.2010 15:55
TarasBer   Дело в том, что я хочу вывести график некой функци…   18.06.2010 15:58
volvo   То, что не было зарезервированных слов try/except …   18.06.2010 16:03
TarasBer   Кстати, а вот почему делить на ноль можно (и безо …   18.06.2010 16:18
volvo   Правда что-ли? А мужики-то не знают: var a, b: e…   18.06.2010 16:39
TarasBer   И вправду вылетает. Да, мне теперь самому интересн…   18.06.2010 16:53
volvo   Упоминание о подобной проблеме присутствует на фор…   18.06.2010 21:53
TarasBer   uses OpenGL;   19.06.2010 17:07
volvo   Что Uses OpenGL? Не делай Uses OpenGL... Смысла …   20.06.2010 17:53
volvo   Ах, ты о том, что при использовании модуля OpenGL …   20.06.2010 18:24
TarasBer   > Так, это само собой: в секции инициализации м…   20.06.2010 20:23


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 6.05.2024 10:06
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name