Floating-point invalid operand

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
San
Сообщения: 2
Зарегистрирован: 26 окт 2004, 21:26

Floating-point invalid operand

Сообщение San » 26 окт 2004, 21:47

Привет Всем!
Сервер FireBird 1.0.3
Периодически в логе появляется ошибка:
↓ Floating-point invalid operand.
An indeterminant error occurred during a
floating-point operation.
This exception will cause the Firebird server
to terminate abnormally.

после чего сервер перезагружается.
Одновременно работают около 30-40 пользователей в разных программах.
Есть подозрение о передаче в UDF некорректного значения.
Может подскажите в каких случаях данная ошибка может появляться или может можно отследить в каком запросе происходит ошибка.

С уважением,
Александр

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 27 окт 2004, 09:50

Т.к. сам сервер практически не работает с FP-числами (а там, где работает, проверяет операнды на корректность перед операцией, не допуская асинхронных исключений процессора), это наверняка ошибка в UDF. Единственное, что смущает - в этом случае в лог должно было записаться имя UDF, вызвавшей эту ошибку.

Если бы была одна программа, я бы предложил в нее добавить протоколирование запросов (или подключить внешний монитор). Для нескольких прог этого не сделаешь... если UDF с FP-операндами используются не часто + внутри ХП, то можно предварить их вызов записью в лог на основе внешней таблицы.

RudyM
Сообщения: 9
Зарегистрирован: 26 окт 2004, 17:44

Сообщение RudyM » 27 окт 2004, 14:39

dimitr писал(а):... это наверняка ошибка в UDF. Единственное, что смущает - в этом случае в лог должно было записаться имя UDF, вызвавшей эту ошибку.
Не знаю, как на счет v.1.5, но v.1.0.x не пишет имя UDF в лог.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 27 окт 2004, 17:46

dimitr писал(а):Т.к. сам сервер практически не работает с FP-числами (а там, где работает, проверяет операнды на корректность перед операцией, не допуская асинхронных исключений процессора)
Тут есть одно исключение - NaN. Сервер их не обрабатывает, т.е. можно такое число запихать в базу, а потом при, например, сложении его с чем-либо еще получить исключение сопроцессора... и будет наблюдаться шатдаун сервера с той самой записью в логе.

San
Сообщения: 2
Зарегистрирован: 26 окт 2004, 21:26

Сообщение San » 27 окт 2004, 19:24

Тут есть одно исключение - NaN. Сервер их не обрабатывает, т.е. можно такое число запихать в базу, а потом при, например, сложении его с чем-либо еще получить исключение сопроцессора... и будет наблюдаться шатдаун сервера с той самой записью в логе.
Я пробовал выполнять запрос в IBExpert с функцией, например:

Select Okrug(sum(sym_dopl*999999.99),1) from dopl;
Поле sym_dopl Numeric(15,2)
Получал результат: 21811633112070344,00 без ошибок.

Гость

Сообщение Гость » 04 ноя 2004, 21:13

Привет Всем!
Проблема действительно была в UDF при вызове функции ROUND или TRUNC.
Пришлось поставить try... except.

Код: Выделить всё

Function Okrug(var A,B:Double):Double;cdecl; export;
begin
  Result:=0;
  try
  if B=0 then Result:=Round(A)
         else Result:=Round(A/B)*B;
  except
  end;       
end;
После этого падения прекратились.

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Сообщение Slava Ekimov » 05 ноя 2004, 09:29

Anonymous писал(а):Привет Всем!
Проблема действительно была в UDF при вызове функции ROUND или TRUNC.
Пришлось поставить try... except.

Код: Выделить всё

Function Okrug(var A,B:Double):Double;cdecl; export;
begin
  Result:=0;
  try
  if B=0 then Result:=Round(A)
         else Result:=Round(A/B)*B;
  except
  end;       
end;
После этого падения прекратились.
Вообще-то Double и Numeric немножко разные типы данных.
Лучше бы ты в функции определял переменные как Int64.
PS А поставил ты не try except, а drop to hole.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 05 ноя 2004, 09:40

Anonymous писал(а):Привет Всем!
Проблема действительно была в UDF при вызове функции ROUND или try
if B=0 then Result:=Round(A)
else Result:=Round(A/B)*B;
except
end;
После этого падения прекратились.
за такой код надо пытать тупыми кусачками :-)
и потом - зачем самому какие то функции писать, если есть куча готовых, в том числе и нормальное округление?

Ответить