Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2010, 17:21   #1
bloodeagle
 
Регистрация: 11.11.2009
Сообщений: 4
По умолчанию Ошибка связанная с floating point...

Задание: Решить в соответствии с вариантом задачу Коши указанным методом y'=0.6*sinx-1.25*y*y+1
Начальное условие: y(0)=0
Проблема в следующем: когда берем отрезок от 0 до 2(Pikar(0,2,0,30), то решение находится без проблем(на 13 итерации)... Но если взять отрезок от 0 до 3(Pikar(0,3,0,30), то несколько итераций он прогоняет нормально, но потом выскакивает ошибка связанная с floating point overflow... Подскажите пожалуйста в чём проблема???

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var 
eps,s,x0,xn,y0,h,x,y:double;
function fff(x,y:double):double;
begin
fff:=0.6*sin(x)-1.25*y*y+1;
end;

procedure Pikar(x0,xn,y0:double;n:integer);
var k,i:integer;
y,_y,x:array[1..100] of double;
F_F:TextFile;
begin
AssignFile(F_F,'Result.txt');
Rewrite(F_F);
eps:=0.1;
k:=0;
h:=(xn-x0)/n;
 for i:=1 to n do
 begin
   x[i]:=x0+i*h;
   y[i]:=y0;
 end;
repeat
   k:=k+1;
   s:=0;
     for i:=1 to n do
       _y[i]:=y[i];
   y[1]:=y0;
     for i:=1 to n do begin
       y[i]:=y[i-1]+fff(x[i],_y[i])*h;
        Memo1.Lines.Add('y[' + floattostr(x[i])+']='+floattostr(y[i]));
       s:=s+sqr(y[i]-_y[i]);
     end;
     s:=sqrt(s);
   Memo1.Lines.Add('k='+inttostr(k)+'; s='+floattostr(s));
until (s<=eps);
for i:=1 to n do
writeln(F_F,floattostr(x[i])+'   '+ floattostr(y[i]));
Memo1.Lines.Add('k='+inttostr(k)+'; s='+floattostr(s));
CloseFile(F_F);
end;

begin

Pikar(0,3,0,30);

end;

end.
bloodeagle вне форума Ответить с цитированием
Старый 18.02.2010, 18:15   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

В тексте есть логическая ошибка, которая, правда, отношения к появлению упомянутой не имеет:
массив чисел объявлен как:
Код:
y,_y,x:array[1..100] of double;
Тем не менее в тексте есть такая индексация к элементам массива:
Код:
for i:=1 to n do begin
       y[i]:=y[i-1]+fff(x[i],_y[i])*h;
Понятно, что обращение к несуществующему элементу приведет к тому что результаты вычислений будут не верными.
Чтобы такие ляпы выявлять необходимо при отладке программы включать директивы компилятору, при которых он бы проверял такие несоответствия (здесь должна быть включена директива "Range checking").

А названная ошибка происходит просто потому, что в отведенную для числа память вычисленное не помещается - оно просто огромное (по абсолютной величине).
Надо либо ограничивать количество итераций, чтобы переполнения разрядной сетки числа не происходило или подбирать входные параметры, либо применять "длинную арифметику".
Скандербег вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка: invalid floating point operation Willow Помощь студентам 3 24.01.2010 18:42
Вылезает ошибка with massage 'Invalid floating point operation' подскажите как устранить. Herly Помощь студентам 2 09.01.2010 18:56
Floating point exception Gorbunov89 Общие вопросы C/C++ 0 19.12.2009 23:05
s not a valid floating point value prod87 Помощь студентам 1 02.12.2009 20:57
Возникает ошибка Invalid floating point operation Иринкаа Помощь студентам 3 29.11.2007 22:10