Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1140345293
Pavel__
2006-02-19 13:34
2006.03.26
Странное поведение memprof


2-1142067592
kkostik
2006-03-11 11:59
2006.03.26
Определить имя устройства!


2-1141645383
Lexa79
2006-03-06 14:43
2006.03.26
Вопрос


15-1140941984
Mozart
2006-02-26 11:19
2006.03.26
СПАМ


1-1140437293
Чапаев
2006-02-20 15:08
2006.03.26
Rewrite





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский