![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Мне нужно найти экстремумы функции методом поразрядного приближения (все еще нужно). Delphi выдает Floating point division by zero. Где тут ошибка? Код:
function F1(x: real):real;
begin
F1:=Ln(x)/Sqrt(x);
end;
procedure TForm1.Result1Click(Sender: TObject);
const n=10;
var
h,x: real;
begin
try
eps:=StrToFloat(Trim(Edit2.Text)); //ïðåîáðàçóåì ââîä â ÷èñëî
except //åñëè âîçíèêëà îøèáêà
ShowMessage('Íåâåðíî çàäàíà òî÷íîñòü');
Edit2.SetFocus;
Exit;
end;
try
a:=StrToFloat(Trim(Edit3.Text)); //ïðåîáðàçóåì ââîä â ÷èñëî
except //åñëè âîçíèêëà îøèáêà
ShowMessage('Íåâåðíî çàäàíà íèæíÿÿ ãðàíèöà èññëåäóåìîãî èíòåðâàëà');
Edit3.SetFocus;
Exit;
end;
try
b:=StrToFloat(Trim(Edit4.Text)); //ïðåîáðàçóåì ââîä â ÷èñëî
except //åñëè âîçíèêëà îøèáêà
ShowMessage('Íåâåðíî çàäàíà âåðõíÿÿ ãðàíèöà èññëåäóåìîãî èíòåðâàëà');
Edit4.SetFocus;
Exit;
end;
if a<=0 then
begin
ShowMessage('Íèæíÿÿ ãðàíèöà èíòåðâàëà íå âõîäèò â îáëàñòü äîïóñòèìûõ çíà÷åíèé ôóíêöèè');
Edit3.SetFocus;
Exit;
end;
if b<a then
ShowMessage('Çíà÷åíèå íèæíåé ãðàíèöû èññëåäóåìîãî èíòåðâàëà íå äîëæíî ïðåâûøàòü çíà÷åíèå âåðõíåé')
else
begin
h:=(b-a)/n;
begin
c:=a;
d:=b;
while h>=eps do
begin
begin
while x<=d do
begin
x:=c+h;
Xmin:=c;
if F1(x)<F1(Xmin) then Xmin:=x;
end;
end;
if Xmin=a then
begin
c:=Xmin;
d:=Xmin+h;
h:=h/n;
end;
if Xmin=b then
begin
c:=Xmin-h;
d:=Xmin;
h:=h/n;
end;
if (Xmin<>a) or (Xmin<>b) then
begin
c:=Xmin-h;
d:=Xmin+h;
h:=h/n;
end;
end;
end;
begin
c:=a;
d:=b;
while h>=eps do
begin
begin
while x<=d do
begin
x:=c+h;
Xmax:=c;
if F1(x)>F1(Xmax) then Xmax:=x;
end;
end;
if Xmax=a then
begin
c:=Xmax;
d:=Xmax+h;
h:=h/n;
end;
if Xmax=b then
begin
c:=Xmax-h;
d:=Xmax;
h:=h/n;
end;
if (Xmin<>a) or (Xmin<>b) then
begin
c:=Xmax-h;
d:=Xmax+h;
h:=h/n;
end;
end;
end;
end;
Label15.Caption:=FloatToStrF(F1(Xmin),ffFixed,7,7);
Label14.Caption:=FloatToStrF(F1(Xmax),ffFixed,7,7);
end; |
|
#2
|
||||
|
||||
|
Ну судя по сообщение наблюдается ошибка деления на 0. Так-что проверяйте строки где происходит это самое деление. Я таких насчитал у вас 7 штук. Если проходов неочень много, можно пошагово пройтись и проверить где именно ошибка вылазит.
|
|
#3
|
|||
|
|||
|
Локальная переменная x не инициализируется каким-либо значением перед тем как использоваться в условии завершения цикла while... Деление на нуль происходит, вероятнее всего, внутри функции F1. Все остальные операции деления в этом участке кода — деление на константу n=10. Если, конечно, проблемный участок именно этот.
|
|
#4
|
|||
|
|||
|
Delphi насколько я знаю не только выводит сообщение об ошибке, но и отображает строку кода где она допущенна... так что строку в студию - и желающих помочь станет гораздо больше...
А вот обойти ошибку не так просто...![]() |