Форум: "Основная";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];
ВнизГлюки с арифметическими вычислениями, провожу вычисления в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c