Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Вниз

Floating point invalid operation 


aleXXoft   (2001-12-13 14:32) [0]

Приветствую!

Прежде, чем задам вопрос, расскажу как всё было...

Есть серверок с базулькой. Сервер - Linux, базулька - Oracle. Пишу клиент для Выни на Дэльфи-5. Oracle Client использую версии 8.1.7.
Всё написал. Работает.

Решил провести "регламентные работы" (много хламу накопилось да и ваще) и проинсталил комп заново (всё тоже самое: от винды2000 до Дэльфи-5 с БДЕ 5.1.1).

Запускаю Дэльфи. Проект компилится, запускается, но... не работает!

Когда я анализирую данные (выполнив SQL-запрос) вылетает ошибка
"Floating Point Invalid Operation". Поля, которые принимают участие в анализе имеют тип INTEGER. Могуть быть NULL. При проверке на IsNull выдаётся FALSE, но при попытке получить значение (например, "i:=DS.FieldByName("counter_value").AsInteger") вылетает вышенаписанная ошибка. По идее, можно и не делать проверку на IsNull, т.к. у меня переменная i преобразуется затем в строку, а тут мы знаем, что если в поле находится NULL, то функция AsString вернёт пустую строку (для меня это не фатально), а если находится ноль, то и вернётся ноль (т.е. AsString="0").
В моём же случае, когда в поле находится NULL возвращается какое-то неимоверно большое (или, наоборот, маленькое) значение, которое ну никак не укладывается в INTEGER (причём оно "чем-то" очень "напоминает" значение с плавающей точкой и огромной степенью).

Так вот, что самое интресное, так это то, что ДО ЭТОГО всё работало! То есть при проверке на IsNull выходило TRUE! Что за хрень?

Кстати, на соседнем компе всё работает до сих пор (там установлен тот же самый софт!).

В принципе, я понимаю почему вылазит именно "Floating Point Invalid Operation". При выполнении функции AsInteger выполняется функция AsFloat, а затем происходит округление. Так вот при округлении полученного функцией AsFloat значения возникает исключение FPU "Invalid Operation". Я посмотрел, что возвращает функция AsFloat. Она возвращает то же, что возвращает функция AsString (только, естественно, не в строковом виде). То есть число с огромной степенью (меньшее/большее по модулю, чем 1e-18/1e18). То есть, собственно, возвращет тот самый NULL, на который должна была обратить внимание функция IsNull.

Так вот главный вопрос: ПОЧЕМУ ФУНКЦИЯ ISNULL НЕПРАВИЛЬНО РАБОТАЕТ?
Или в более общей форме: КАКОГО РОЖНА ВООБЩЕ ТАК ПРОИСХОДИТ?

%(

С приветом, aleXXoft
Успехов!



petr_v_a   (2001-12-13 15:20) [1]

ВЫкинь "БДЕ 5.1.1" на помойку. Понимаю, очень радикально, и, возможно, не от тебя зависит, но действенно...



aleXXoft   (2001-12-13 15:29) [2]

Это от этого? Ты уверен? На компах, где работает всё нормально стоит тоже 5.1.1

Причина в версии БДЕ? На разных компах БДЕ работает по-разному? Бред.

С приветом, aleXXoft
Успехов!



aleXXoft   (2001-12-13 15:57) [3]

a?



petr_v_a   (2001-12-13 16:14) [4]

ага :) независимо от версии



Mick   (2001-12-13 16:21) [5]

Поиграй с параметрами "ENABLE BCD" и "ENABLE INTEGERS"



Val   (2001-12-13 16:27) [6]

...ставил я себе NT посде 98, видел у себя подобную ошибку :), в "Язык и стандарты->Числа" ставится точка-разделитель вместо запятой и все..



aleXXoft   (2001-12-13 18:14) [7]

Спасибо всем, кто участвовал в этом разговоре, но всё оказалось почти так, как сказал petr_v_a. Вот. Снёс БДЕ 5.11 и поставил тот, что идёт вместе Д5 (5.01) Всё заработало! БДЕ 5.11 - ГЛЮК!!! Не ставьте его!

С приветом, aleXXoft
Успехов!



petr_v_a   (2001-12-13 19:29) [8]

В идеале при работе с Oracle лучше от BDE отказаться как таковой, если, конечно возможно




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.013 c
1-52599           greenrul              2001-12-29 14:42  2002.01.17  
Почему random(4) всегда возвращает 0???


4-52684           Roman_                2001-11-16 23:00  2002.01.17  
Вывод многострочного текста под углом


1-52526           Baz                   2001-12-26 10:21  2002.01.17  
Господи, да что ж делается-то?!


14-52643          Андрей Сенченко       2001-11-19 17:13  2002.01.17  
Зачем нужны DLL ?


7-52678           Andey                 2001-09-27 19:55  2002.01.17  
Определение номера