Floating-point invalid operand
Floating-point invalid operand
Привет Всем!
Сервер 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 некорректного значения.
Может подскажите в каких случаях данная ошибка может появляться или может можно отследить в каком запросе происходит ошибка.
С уважением,
Александр
Сервер 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 некорректного значения.
Может подскажите в каких случаях данная ошибка может появляться или может можно отследить в каком запросе происходит ошибка.
С уважением,
Александр
Т.к. сам сервер практически не работает с FP-числами (а там, где работает, проверяет операнды на корректность перед операцией, не допуская асинхронных исключений процессора), это наверняка ошибка в UDF. Единственное, что смущает - в этом случае в лог должно было записаться имя UDF, вызвавшей эту ошибку.
Если бы была одна программа, я бы предложил в нее добавить протоколирование запросов (или подключить внешний монитор). Для нескольких прог этого не сделаешь... если UDF с FP-операндами используются не часто + внутри ХП, то можно предварить их вызов записью в лог на основе внешней таблицы.
Если бы была одна программа, я бы предложил в нее добавить протоколирование запросов (или подключить внешний монитор). Для нескольких прог этого не сделаешь... если UDF с FP-операндами используются не часто + внутри ХП, то можно предварить их вызов записью в лог на основе внешней таблицы.
Тут есть одно исключение - NaN. Сервер их не обрабатывает, т.е. можно такое число запихать в базу, а потом при, например, сложении его с чем-либо еще получить исключение сопроцессора... и будет наблюдаться шатдаун сервера с той самой записью в логе.dimitr писал(а):Т.к. сам сервер практически не работает с FP-числами (а там, где работает, проверяет операнды на корректность перед операцией, не допуская асинхронных исключений процессора)
Я пробовал выполнять запрос в IBExpert с функцией, например:Тут есть одно исключение - NaN. Сервер их не обрабатывает, т.е. можно такое число запихать в базу, а потом при, например, сложении его с чем-либо еще получить исключение сопроцессора... и будет наблюдаться шатдаун сервера с той самой записью в логе.
Select Okrug(sum(sym_dopl*999999.99),1) from dopl;
Поле sym_dopl Numeric(15,2)
Получал результат: 21811633112070344,00 без ошибок.
Привет Всем!
Проблема действительно была в UDF при вызове функции ROUND или TRUNC.
Пришлось поставить try... except.
После этого падения прекратились.
Проблема действительно была в 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;
-
- Сообщения: 44
- Зарегистрирован: 26 окт 2004, 14:30
Вообще-то Double и Numeric немножко разные типы данных.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;
Лучше бы ты в функции определял переменные как Int64.
PS А поставил ты не try except, а drop to hole.
за такой код надо пытать тупыми кусачкамиAnonymous писал(а):Привет Всем!
Проблема действительно была в UDF при вызове функции ROUND или try
if B=0 then Result:=Round(A)
else Result:=Round(A/B)*B;
except
end;
После этого падения прекратились.
и потом - зачем самому какие то функции писать, если есть куча готовых, в том числе и нормальное округление?