Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с Invalid floating point operation!! [D7, WinXP]


Smarty ©   (2005-10-23 14:59:00) 

Народ!
Подскажите плиз что я делаю не так?
имеем переменные:
MaxRowId:integer;
r:double;
При попытке выполнить: r:=MaxRowId/2 выскакивает ошибка "Invalid floating point operation". Что я делаю не так?
причем если перед этим вычислением постваить ShowMessage(MaxRowId) все работает.


umbra   (2005-10-24 12:16:00) [1]


> Invalid floating point operation

А у меня такое часто случалось на D7, когда с датами работал и брейкпойнты в процедурах обработки дат ставил. Ставишь точку прерывания - получаешь исключение, убираешь - все работате как часы.


han_malign   (2005-10-24 12:13:00) [2]

З.З.Ы. Причем глюк всегда именно при делении целых с приведением к плаващей точке...


han_malign   (2005-10-24 12:11:00) [3]

Были такие приколы, WinAPI в некоторых местах(чаще в вызовах kernel32) изменяет флаги сопроцессора - Delphi где может это фиксит(SafeLoadLibrary например), но в основном полагается на эксклюзивное владение сопроцессором(и глобально неизменное состояние), что иногда приводит к некоректной работе System._FSafeDivide.
Спасает asm FINIT end;перед делением...

З.Ы. Глюк идет еще со времен BP7.0/D1 под DPMI.


Smarty   (2005-10-23 18:14:00) [4]

:) я тоже был учень удивлен такому повороту событий, однако в MaxRowId всегда находилось нормальное ненулевое значение, да и к простому делению на 2 особо не придерешься. Может Delphi глюканул? В любом случае всем спасибо! А я обошелся без этого деления :)


Юрий Зотов   (2005-10-23 17:30:00) [5]


procedure TForm1.FormCreate(Sender: TObject);
var
  MaxRowId: integer;
  R: double;
begin
  MaxRowId := Handle;
  R := MaxRowId / 2;
  ShowMessage(FloatToStr(R))
end;

И все работает. Значит, ответ на вопрос "Что я делаю не так?" нужно искать в другом месте кода.


Loginov Dmitry   (2005-10-23 17:04:00) [6]

Ведь ясно же написано: "Invalid floating point operation". Сделай соответствующие выводы.


Наверх

Титульная страница Поиск, карта сайта Написать письмо