![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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 насколько я знаю не только выводит сообщение об ошибке, но и отображает строку кода где она допущенна... так что строку в студию - и желающих помочь станет гораздо больше... 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	  А вот обойти ошибку не так просто...![]()  |