Показать сообщение отдельно
  #1  
Старый 07.06.2009, 12:40
Polina.from Polina.from вне форума
Прохожий
 
Регистрация: 04.06.2009
Сообщения: 2
Репутация: 10
По умолчанию Floating point division by zero. Где ошибка?

Здравствуйте!
Мне нужно найти экстремумы функции методом поразрядного приближения (все еще нужно). 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;
Ответить с цитированием