Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизОшибка при работе функций trunc и int. Найти похожие ветки
← →
Unknown user (2003-10-27 19:43) [0]При вызове данных функций с определенными значениями аргументов возникает исключение invalid floating point operation. Значения аргументов за диапазон не выходят, при вызове с теми же аргументами round -все проходит гладко. В чем может быть дело? Я уже не знаю, что думать.
← →
Sergey_Masloff (2003-10-27 19:47) [1]>При вызове данных функций с определенными значениями аргументов >возникает исключение invalid floating point operation
При таких сильных утверждениях неплохо привести эти значения аргументов.
← →
Anatoly Podgoretsky (2003-10-27 20:02) [2]Что то не верится, ты случайно не обманываешь нас?
← →
Unknown user (2003-10-27 20:08) [3]2 Sergey_Masloff. Оно все кажется забавным, как так такие простые и проверенные функции -5 строчек ассемблерного кода, и вызывают ошибку. Я бы сам не поверил если бы не столкнулся, но тем не менее компилятор явно указывает адрес исключения, и замена trunc на round убирает ошибку. А насчет значений аргументов - закономерности я не нашел, в программе данная функция вызывается сотню раз в секунду всегда с новым значением аргумента, и при определенном(случайном) значении возникает исключение. Указатели не используются.
← →
Anatoly Podgoretsky (2003-10-27 20:10) [4]и замена trunc на round убирает ошибку одназначно нас обманул с Значения аргументов за диапазон не вых
← →
Unknown user (2003-10-27 20:13) [5]2 Anatoly Podgoretsky. Нет, Borland"oм клянусь. Мне даже пришлось написать свою функцию trunc(после нескольких часов безуспешного поиска ошибки).
← →
Unknown user (2003-10-27 20:15) [6]2 Anatoly Podgoretsky. Нет ну если для Single число 1.49545 -выход за range -тогда виноват.
← →
Anatoly Podgoretsky (2003-10-27 20:22) [7]Unknown user © (27.10.03 20:13) [5]
И чем же твой trunc отличается от стандартного, могу по секрету сообщить, что стандартный использует аппаратные возможности сопроцессора, просто записывает результат в переменную.
← →
default (2003-10-27 20:24) [8]ты скажи при каком именно значение Trunc падает(
а если после ряда значений он падает, значит это уже не он виноват скорее всего
← →
Unknown user (2003-10-27 20:27) [9]2 Anatoly Podgoretsky.
function Trunc(V:Single):integer;
begin
Result:=Round(V);
if V-Result<0 then Result:=Result-1;
end;
← →
Unknown user (2003-10-27 20:29) [10]2 default. Да, "падает" именно после ряда значений.
← →
default (2003-10-27 20:32) [11]
procedure _TRUNC;
asm
{ -> FST(0) Extended argument }
{ <- EDX:EAX Result }
SUB ESP,12
FNSTCW [ESP].Word // save
FNSTCW [ESP+2].Word // scratch
FWAIT
OR [ESP+2].Word, $0F00 // trunc toward zero, full precision
FLDCW [ESP+2].Word
FISTP qword ptr [ESP+4]
FWAIT
FLDCW [ESP].Word
POP ECX
POP EAX
POP EDX
end;
вот его код, и это не пять строк
попробуй создай новый проект и там повызывай Trunc с Random-ыми значениями
← →
Anatoly Podgoretsky (2003-10-27 20:34) [12]Да тут как минимум два преобразования в Extended
← →
Anatoly Podgoretsky (2003-10-27 20:36) [13]Да лучше сделать отладочную версию, вызывать два Trunc и анализ при ошибке
← →
Unknown user (2003-10-27 20:49) [14]2 default & Anatoly Podgoretsky. Пробовал уже получать значение аргумента через Random -все Ок, ошибка не возникает. Вот участок моего кода, вызывающего ошибку:
Frames:=trunc(GetTickCount*0.001-FStartFrameTime)*Mov.FramesPerSecond);
FStartFrameTime:Single
Mov.FramesPerSecond:integer;
← →
Anatoly Podgoretsky (2003-10-27 21:01) [15]Вот здесь неясная величина FStartFrameTime, как оно получается, чему равно и почему оно в Single, а не целое или хотя бы Double
Провел бы ты отладку
← →
Unknown user (2003-10-27 21:13) [16]2 Anatoly Podgoretsky & default. Спасибо за помощь. Буду рыть дальше...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c