Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Глюки с арифметическими вычислениями, провожу вычисления в Delphi   Найти похожие ветки 

 
Grol ©   (2006-02-20 19:00) [0]

Здравствуйте. Программирую уже 2 года с небольшим. До этого мне не приходилось писать программы с какими-либо вычислениями до сегодня. Возникла следующая проблема. Суть проблемы в следующем: внизу приведен код... там, необходимо обратить внимание на строчки, где вычисляются переменные Ao1 и Ao2. Вот когда провожу вычисления, то по какой-то причине компилятор (или что еще другое) пропускает строчку, где вычисляется Ao1, а в Ao2, деление я заменил на функцию Power со степенью -1 и компилятор перестал пропускать эту строчку, но все равно, если даже она уже не пропускается, то какие-то странные результаты вычисления в Ao2. Блин...не знаю, что делать даже. Помогите разобраться с проблемой.


procedure TForm1.Button1Click(Sender: TObject);
var
 Ao1,Bo1,Co1,
 Ao2,Bo2,Co2,    //коэфициенты системы
 a,b,c,D,x1,x2,    //коэфициенты квадратного уровнения
 p1,p2,p3,           //давление
 t1,t2,t3,              //время
 TempExt1,
 TempExt2,
 TempExt3:       Double; //Extended
begin
t1:=Amasx[2];
p1:=Amasy[2];

t2:=Amasx[Round(HIGH(Amasx)/2)];  //Amasx, Amasy - глобально объявленные массивы с данными
p2:=Amasy[Round(HIGH(Amasy)/2)];  //уже заполнены данными

t3:=Amasx[HIGH(Amasx)-1];
p3:=Amasy[HIGH(Amasy)-1];

TempExt1:=(t2-t1)*(p1-p3);
TempExt2:=t2*(t3+t1)*(p1-p2);

a:=t3*TempExt1-TempExt2;
b:=TempExt1-2*TempExt2;
c:=2*(p2-p1);
D:=SQR(b)-4*a*c;
if D>=0 then
 begin
 x1:=(-b+SQRT(D))/(2*a);
 x2:=(-b-SQRT(D))/(2*a);
 if (x1<>0) and (x1<>(-1/t3)) then
   Co1:=x1;
 if (x2<>0) and (x2<>(-1/t3)) then
   Co2:=x2;
 end
 else
 begin
 ShowMessage("Дискременант отрицательный!");
 Exit;
 end;
TempExt3:=(p1-p2)*Power((t2-t1),-1);

if Co1<>0 then
 begin
 Ao1:=p1-TempExt3*(1/Co1+t2); //обратить внимание на эту строчку
 Bo1:=TempExt3*(1+Co1*t1)*(Power(Co1,-1)+t2);
 end;
if Co2<>0 then
 begin
 Ao2:=p1-TempExt3*(Power(Co2,-1)+t2); //и еще на эту
 Bo2:=TempExt3*(1+Co2*t1)*(Power(Co2,-1)+t2);
 end;
end;


Я скомпилировал прогу по F9. Перехожу в редактор кода. Напротив каждой строки слева компилятор ставит точки. Это означает, что код на этой строчки будет выполняться, а где точки нет, там компилятор даже не остановится. То есть точка - эта точка останова, где компилятор может остановится...путаница :) Где строчка с вычислениями Ao1 точки нет....


 
TUser ©   (2006-02-20 19:06) [1]

Оптимизатор выбрасывает эти точки и пишет варнинг - Value assigned to Ao1 is never used. Еще более умный оптимизатор выбросил бы все эти if.


 
Ega23 ©   (2006-02-20 19:06) [2]


> Где строчка с вычислениями Ao1 точки нет....


А она у тебя больше нигде не используется, поэтому оптимизатор её выкинул, как ненужную.
Не хочешь - Project->Options->Compiler->Code Generation->Optimization галочку убери.


 
Grol ©   (2006-02-20 19:38) [3]

Ага...понятно, т.е. если я после всех вычисленй напишу следующее, например: edit1.text:=floattostr(Ao1), то компилятор тут же сочтет, что эта переменная используется, т.к. после расчетов выводится в визуальный компонент. Ладно...а почему тогда, если написать так Ao1:=p1-TempExt3*(1/Co1+t2), то эта строчка будет пропущена, а если написать так Ao1:=p1-TempExt3*(Power(Co1,-1)+t2), то эта строчка будет выполнена. Непонятка...


 
Ega23 ©   (2006-02-20 19:44) [4]

Надо реализацию функции Power смотреть.


 
palva ©   (2006-02-20 21:02) [5]

> Ao1:=p1-TempExt3*(Power(Co1,-1)+t2), то эта строчка будет выполнена. Непонятка

А вы уверены, что строчка будет выполнена вся? Для компилятора логично выполнить только функцию Power, поскольку ему неизвестно: может быть Power выводит что нибудь на печать или изменяет значения каких нибудь переменных (побочный эффект). Мы-то знаем, что функция power это всего лишь возведение в степень, а компилятор, возможно, подозревает, что вы могли переопределить эту функцию в каких нибудь подключаемых модулях.


 
Grol ©   (2006-02-20 22:10) [6]

Спасибо, вот теперь все понятно...то есть компилятор не может заглянуть дальше...внутрь функции.


 
Дмитрий Белькевич ©   (2006-02-21 01:13) [7]

Время компиляции было бы совсем другим. Поэтому предполагается худший вариант (что бы не было потенциальных глюков), что power не только что-то вычисляет, а еще что-то делает.


 
Германн ©   (2006-02-21 01:36) [8]


> Grol ©   (20.02.06 22:10) [6]
>
> Спасибо, вот теперь все понятно...то есть компилятор не
> может заглянуть дальше...внутрь функции.

Оптимизатор компиллятора - всего лишь оптимизатор. Может когда-нибудь он усовершенствуется, но всё равно останется лишь оптимизатором в той или иной степени. И сможет "заглядывать всё дальше и дальше и дальше..."

А ИИ ещё не создали. АП уже это доказал. :(((



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.066 c
2-1141829973
Nsk3D
2006-03-08 17:59
2006.03.26
вставка в функцию


2-1141973054
Елена
2006-03-10 09:44
2006.03.26
Работа с динамическими компонентами


2-1142244040
Arkady
2006-03-13 13:00
2006.03.26
TBlobField


1-1140099202
rolex
2006-02-16 17:13
2006.03.26
Как быстро удалить файл?


15-1141120583
AlexeyT
2006-02-28 12:56
2006.03.26
Статья "Написание оптимального кода под Delphi"