Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #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;
Ответить с цитированием
  #2  
Старый 07.06.2009, 13:37
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ну судя по сообщение наблюдается ошибка деления на 0. Так-что проверяйте строки где происходит это самое деление. Я таких насчитал у вас 7 штук. Если проходов неочень много, можно пошагово пройтись и проверить где именно ошибка вылазит.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 07.06.2009, 17:26
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Локальная переменная x не инициализируется каким-либо значением перед тем как использоваться в условии завершения цикла while... Деление на нуль происходит, вероятнее всего, внутри функции F1. Все остальные операции деления в этом участке кода — деление на константу n=10. Если, конечно, проблемный участок именно этот.
Ответить с цитированием
  #4  
Старый 08.06.2009, 09:51
Interface Interface вне форума
Активный
 
Регистрация: 23.05.2008
Адрес: Россия, Уфа
Сообщения: 203
Репутация: 1
По умолчанию

Delphi насколько я знаю не только выводит сообщение об ошибке, но и отображает строку кода где она допущенна... так что строку в студию - и желающих помочь станет гораздо больше... А вот обойти ошибку не так просто...
__________________
Я ни в чем никогда не уверен... И в этом тоже...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025