Member
Статус: Не в сети Регистрация: 30.01.2003 Откуда: Москва
Daemon поищи DeDe (Delphi Decompiler). Более-менее структуру кода выцарапать можно, но сам код будет на асме. Насколько мне известно, еще нет таких прог, которые смогли бы восстановить исходный текст на языке высокого уровня. Хотя это возможно
Народ, помогите советом: как в Delphi избавиться от ошибки Floating point overflow.
У меня в проге довольно много переменных, и все считается ОК до появления одного сложного выражения.
Пытался лечить следующим образом:
1. Сделал переменными глобальными
2. Весь текст программы перенес в одну процедуру
3. максимально снизил число переменных
Ничего не помогло.
Member
Статус: Не в сети Регистрация: 02.05.2004 Откуда: Tver
скорее всего дельфи нипричем, просто выражение настолько изощренное что промежуточный результат вылетает за пределы FP80. Может быть многократное возведение в степень ? Может быть банальный выход за границы массива. Запусти под отладчиком и попробуй разбить на много более простых выражений, проще искать. Если текст небольшой лучше напиши в форуме, слишком много вариантов чтоб сказать конкретнее
Ray Adams Сейчас в общем догнал до того что вылетает на первой итерации вычислительного цикла но указатель ошибки ставит в конце проги (end.)
После удаления выражения dz:=vx*dt+ax*dt*dt/2 или x:=x+dz вылетать перестает, так что как я понимаю проблемы с переменной dz или входящей в нее ax, т.к. при ее вычислении используется несколько экспонент.
ax:=e_m*(C1/C2+C3/C2*(exp(2*Pi_L*x)-exp(Pi_L*x)*cos(Pi_L*y)) / (1+exp(2*Pi_L*x)-2*exp(Pi_L*x)*cos(Pi_L*y)))
здесь все кроме x и y сложные константы.
vor Самое странное во всем этом, что значения всех этих переменных я сделал весьма маленькими (по сравнению со старыми). Специально отследил все значения, они все порядка 10-100.
Ray Adams Бесполезно, пробовал все типы. По сути разницы нет, Double по сути есть тип Real не урезанный до Real48 (разрешаюшая способность 15-16 знаков 8 байт), в этом отношении самый прогрессивный тип Extended, но и он мне не помог! Я уже все типы перепробовал.
Короче сейчас всю прогу свел к одному циклу:
while t<10 do begin
ax:=e_m*(C1/C2+C3/C2*(exp(2*Pi_L*x)-exp(Pi_L*x)*cos(Pi_L*y)) / (1+exp(2*Pi_L*x)-2*exp(Pi_L*x)*cos(Pi_L*y)));
ay:=e_m*(C3/C2*( exp(Pi_L*x)*sin(Pi_L*y) )/( 1+exp(2*Pi_L*x)-2*exp(Pi_L*x)*cos(Pi_L*y) ));
dz:=vx*dt+ax*dt*dt/2; // здесь начинает вылетать
vx:=vx+ax*dt;
dy:=vy*dt+ay*dt*dt/2;
vy:=vy+ay*dt;
x:=x+dz; y:=y+dy;
pic.Canvas.Ellipse(round(x*k-1),round(y*k-1),round(x*k+1),round(y*k+1));
t:=t+dt;
end;
Вылетает на первой-же итерации при вычислении dz.
Народ, кто лечил как либо такую фигню, отзовитесь плиз!!!
Мож, кто знает, такие косяки только в Delphi? Мне одни ребята говорили, что С++ Builder этим тоже страдает.
Подскажите правда это или нет. Я имею начальные навыки программирования на С++ (Builder), Fortran, Pascal и Basic, скажите что выбрать чтобы такой бяки не было.
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Silver_Clash проверь чему равны vx, dt и ax(особенно) перед вычислением dz
типа ShowMessage('vx= '+FloatToStr(vx)+' ; dt= '+FloatToStr(dt)+'; ax= '+FloatToStr(ax));
может они просто слишком большие (больше 10^4096 кажется, если extended)
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Lord_of_Darkness Смотри выше! Я отследил все значения при помощи Watch. Раньше значения действительно были большими, но после исключения некоторой константы порядка 10 в степени 11 (эта константа здесь еще фигурирует - e_m - удельный заряд электрона), порядок переменных снизился до 1 или 2. Тип сейчас стоит Real.
Добавлено спустя 6 минут, 52 секунды: Lord_of_Darkness сорьки, кажись ты прав, сейчас опять прогу гоняю, и ax зашкаливает! Странно два часа назад не зашкаливало!
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Вот у меня проблемка возникла:
Я пишу прогу и в процессе добавлял нестандартные компоненты при этом размер приложения прилично вырос (почти до 800кб), далее я эти компоненты удалил, но все-равно после компиляции размер аппликухи остается 800кило!
Как бы мне это вылечить???
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения