Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Деление на ноль   Найти похожие ветки 

 
Murad ©   (2003-11-11 11:00) [0]

Люди, подскажите в чем дело...
На строке номер 2 исключение не поднимается, хотя должно было быть деление на 0.
Но регистр сопроцессора ZE становится = 1

0 MaxDist := 0;
1 try
2 coef1 := -dist1 / (maxDist * 1.3);
3 if coef1 < 0 then coef1 := 0;
4 except
5 on E: EMathError do coef1 := 0;
6 end;


 
Dimka Maslov ©   (2003-11-11 11:02) [1]

При работе из-под отладчика исключения такого рода не возникают, а результат операции принимает значание INF или NAN. При самостоятельной работе возникают исключения.


 
Skier ©   (2003-11-11 11:03) [2]

Какой знакомый код ! :)


 
Плохиш_   (2003-11-11 11:06) [3]

>Dimka Maslov © (11.11.03 11:02) [1]

В данном примере, телепаты говорят MaxDist есть локальная переменная, поэтому компилятор подставляет в выражение константу 0 и ресультат получается INF не зависимо от отладчика.
Сделай MaxDist глобальной и присвой 0 в соседней процедуре и получишь исключение.


 
Murad ©   (2003-11-11 11:18) [4]

2Плохиш_
Я тут обманул немного всех
MaxDist := f(x);
Т.е. там не простое присвоени 0, а вычисление, результат
которого = 0


 
Murad ©   (2003-11-11 11:23) [5]

2Плохиш_
Твоя Пифия тебя обманула... MaxDist - поле объекта, в чьем
методе мы находимся...


 
Anatoly Podgoretsky ©   (2003-11-11 11:27) [6]

И мы должны гадать, что такое
MaxDist, coef1, dist1, f(x)


 
Murad ©   (2003-11-11 11:34) [7]

2Dimka Maslov
Если бы было, как ты говоришь, то у нас логика выполнения
программы зависила бы от того в отладчике мы или нет...
То что ты написал - не верно. (Я проверял, через ShowMessage)


 
Murad ©   (2003-11-11 11:35) [8]

2Anatoly Podgoretsky
Мне никто ничего не должен... особенно Вы


 
Anatoly Podgoretsky ©   (2003-11-11 11:35) [9]

И ты хочешь получить ответ?


 
Думкин ©   (2003-11-11 11:36) [10]

А откуда ты знаешь, что там 0?


 
Anatoly Podgoretsky ©   (2003-11-11 11:40) [11]

dist1 это константа


 
REA ©   (2003-11-11 11:43) [12]

А они кстати не отключены?


 
Murad ©   (2003-11-11 11:44) [13]

2Думкин
1. Отладчик показывает (хотя я понимаю что это не очень надежно)
2. if maxDist = 0 then showMessage("00000000"); {Высвечивается}
3. После выполнения строки 2, coef1 = INF (хотя это тоже
отладчик показывает)

2Anatoly Podgoretsky
Хочу, но Ваш агрессивный тон мне не понятен... Вы мне вчера
объясняли что модерируете потрепаться, так-как многие посты
противно читать... когда нормальный разговор взвинчивают,
таким образом как Вы, это тоже противно читать...


 
Murad ©   (2003-11-11 11:48) [14]

2Anatoly Podgoretsky
Нет, не константа
MaxDist : Double
coef1, dist1 : Single

2REA
Нет, не отключены


 
REA ©   (2003-11-11 11:52) [15]

Если подключать Си библиотеки или там OpenGL то с мат. сопроцессором могут происходить разные забавные вещи. Как это обходить я уже не помню, но была такая информация (типа вставки asm инструкций).


 
Anatoly Podgoretsky ©   (2003-11-11 11:53) [16]

Murad © (11.11.03 11:44) [13]
Ты все перепутал, это тебе Игорь Шевченко объяснял и не место здесь это обсуждать.

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


 
Murad ©   (2003-11-11 11:54) [17]

2REA
Я как раз об этом хотел написать.. там подключается OPENGL


 
Murad ©   (2003-11-11 11:58) [18]

2Anatoly Podgoretsky ©
>Ты все перепутал...
Согласен, но тем не менее...

>У тебя спросил привести подробную информацию о типах
Фраза "И мы должны гадать, что такое MaxDist, coef1, dist1, f
(x)" мной за нормальный вопрос не воспринимается, а
воспринимается как эдакая бравада и снисхождение...


 
Murad ©   (2003-11-11 12:01) [19]

2REA © (11.11.03 11:52) [15]
Да, я и сделал этот обход...
вставка asm FINIT; end; все исправляет,
но я считаю что такой сброс флагов, не очень корректен,
и буду стараться его избежать...


 
Anatoly Podgoretsky ©   (2003-11-11 12:02) [20]

REA © (11.11.03 11:52) [15]
Есть такое дело, некоторые библиотеки меняют флаги процессора.
Но для данного примера если убрать замаскированое исключение, как положено вылетает ошибка деления, и естественно она не вылетает, поскольку автор это запретил.
В тестовом примере только одно изменение, dist1 := 1;


 
REA ©   (2003-11-11 12:03) [21]

Нет гарантиии что он же не отключает исключения. Попробуй их включить (Set8087CW кажется).


 
REA ©   (2003-11-11 12:05) [22]

Ну в принципе да - константы он не вычислит, если не обмануть.


 
Anatoly Podgoretsky ©   (2003-11-11 12:07) [23]

Как же не отключает, именно отключает, явно сказано обрабатывать EMathError

4 except
5 on E: EMathError do coef1 := 0;
6 end;

остальное игнорировать, если бы была добавлена обработка и других исключений, то было бы все нормально, а так все кроме EMathError отключено.


 
Murad ©   (2003-11-11 12:08) [24]

2REA © (11.11.03 12:03) [21]
Все я это уже делал...

2Anatoly Podgoretsky
> В тестовом примере только одно изменение, dist1 := 1;
Что Вы имеете ввиду? Строчка не очень понятна


 
Murad ©   (2003-11-11 12:11) [25]

2Anatoly Podgoretsky © (11.11.03 12:07) [23]
Я здесь отчасти виноват... не написал, что даже если
написать просто
4 except
5 ShowMessage("EEE")
6 end;

то сообщение не высветится (управление не пройдет по строке 5),


 
Anatoly Podgoretsky ©   (2003-11-11 12:11) [26]

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

except
coef1 := 0;
end;


 
Anatoly Podgoretsky ©   (2003-11-11 12:12) [27]

Murad © (11.11.03 12:11) [25]
У меня высвечивается


 
Murad ©   (2003-11-11 12:19) [28]

Все нашел... я случайно написал
SetExceptionMask(excMsk+[exZeroDivide]);
а надо было
SetExceptionMask(excMsk-[exZeroDivide]);

2REA & Anatoly Podgoretsky
Большое спасибо за помощь


 
Anatoly Podgoretsky ©   (2003-11-11 12:25) [29]

Это истинная причина, но точно также ты этот код не привел, а насколько я понимаю это твой код
SetExceptionMask(excMsk+[exZeroDivide]);


 
Murad ©   (2003-11-11 12:37) [30]

2Anatoly Podgoretsky
Да это мой код(Вернее код который мне приходится
сопровождать), согласен... Просто я не мог привести весь
код, (а вызов SetExceptionMask(excMsk+[exZeroDivide])
вообще в другом месте ) поэтому привел, тот, в котором (КАК Я
ДУМАЛ :(() ошибка.
А оказалось, что я не правильно понял описание
функции SetExceptionMask, и взвел(оставил взведенным) флаг
exZeroDivide, хотя надо было его снять... Наличие этого флага - это требование OPENGL, видимо при инициализации OPENGL его
взводит. А логика программы к этому не готова... :((( :)).

Еще раз всем большое спасибо.


 
Anatoly Podgoretsky ©   (2003-11-11 13:12) [31]

Это к тому, что без приведения информации, очень трудно дать квалифицированный совет, особенно в таком случае и чем подробнее ты приведешь, тем меньше будет воды в ветке.
И тут нет ничего личного.

Кстати очень редко использвемое программистами, на этот уровень обычно не лезут.


 
Murad ©   (2003-11-11 13:26) [32]

2Anatoly Podgoretsky
> Кстати очень редко использвемое программистами, на этот
уровень обычно не лезут.

Да и я бы не полез, а что делать, иначе далее все начинает
валиться с жуткой руганью... Мне даже несколько функций
пришлось из D6 в D5 перевести, в том числе и SetExceptionMask


 
Anatoly Podgoretsky ©   (2003-11-11 13:35) [33]

Кстати деже если не лезть самому, то это могут сделать и другие, на что мы намекнули, а вот это будет самое отвратительное, не только по исключением, но и по округлению, программа работает, но временами непонятно по каким причинам выдает неправильные результаты. Мне пришлось как наблюдать в борландовских конференциях поиск подобных блох. Сейчас уже не помню на что именно ыли жалобы, но неприятность состояла в каких то системных билиотеках и вроде OpenGl тоже вспоминали.


 
Murad ©   (2003-11-11 13:55) [34]

2Anatoly Podgoretsky
> Кстати деже если не лезть самому, то это могут сделать и
другие, на что мы намекнули...

Это было одно из первых о чем я и подумал, еще до того как
написал в форум. Именно поэтому я и перенес SetExceptionMask
из D6 в D5. И как оказалось - я был прав... Просто я неверно
(невнимательно) прочитал хелп и поэтому это не дало
результатов... Вот тогда я и написал в форум, т.е. это была
крайняя мера... И пост REA © (11.11.03 12:03) [21] ,
натолкнул меня на мысль, что я был на правильном пути, просто
что-то не учел.



Страницы: 1 вся ветка

Текущий архив: 2003.11.20;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.033 c
4-66162
Andrey Voznesenskiy
2003-09-24 18:18
2003.11.20
убийство и рождение потока


1-65983
Шишкин Илья
2003-11-10 17:43
2003.11.20
Работа с файлами


1-65829
S@b@k@.
2003-11-10 04:36
2003.11.20
массив компонентов


1-65865
VitGun
2003-11-09 13:13
2003.11.20
Редактора экранных форм


14-66057
sowell
2003-10-30 10:33
2003.11.20
Как получить сертификат от BrainBench?