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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2011, 15:10   #1
hottabi4
 
Регистрация: 10.06.2011
Сообщений: 5
По умолчанию ошибка в коде. не могу понять где.

Добрый день всем.
Есть задание( ВычМат) по построению графиков функции, интерполяционного полинома Лагранжа и погрешности вычисления.
Написал код на Delphi, но при выполнении выдает ошибку: "Project Project8.exe raised exception class EInvalidOP with message 'Invalid floating piont operation'."
Помогите пожалуйста разобраться. Та же самая ерунда и с полиномом Ньютона.

Вот сам код программы:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Grids;

type
  TForm1 = class(TForm)
    Chart1: TChart;
    Series1: TLineSeries;
    Series2: TLineSeries;
    Chart2: TChart;
    Series3: TLineSeries;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const n=11;

var
  Form1: TForm1;
  i,j: integer;
  x,y:array [0..11] of real;
  x1,x2,h: real;
  xu,x3: array [-10..10] of real;
implementation

{$R *.dfm}

function Funct(x:real):real;
begin
  Funct:=3*x*x+2*x+14;
end;

function lagrang(xl,yl: array of real; q: real; ni: integer): real;
var
  i,j:integer;
  lag,p,s: real;
begin
  lag:=0;
  for i:=1 to ni do
    begin
      p:=1;
      for j:=1 to ni do
        if i<>j then
          p:=(q-xl[i])/(xl[j]-xl[i]);
      lag:=lag+yl[i]*p;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  x1:=-10;
  x2:=10;
  h:=(x2-x1)/n;

  for i:=0 to n  do
  begin
    x[i]:=x1+h*i;
    y[i]:=Funct(x[i]);
  end;

  for i:=-10 to n-1 do
  begin
    x3[i]:=x3[i]+i;
    xu[i]:=xu[i]+x3[i];
  end;

for i:=0 to n do
begin
  Series1.AddXY(x[i],funct(x[i]));
   Series2.AddXY(x[i],lagrang(x[i],y[i],xu[i],n));
    Series3.AddXY(x[i],abs(funct(x[i])-lagrang(x[i],y[i],xu[i],n)));

 end;

end;

end.
hottabi4 вне форума Ответить с цитированием
Старый 10.06.2011, 15:23   #2
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Вероятно гдето деление на ноль происходит.

Цитата:
207 Invalid floating point operation (Недопустимая операция с плавающей запятой) .
Возможные причины сообщения:
• аргумент функций TRUNC или ROUND не может быть преобразован в целое число, находящееся внутри диапазона типа LONGINT (от -2147483648 до +2147483647);
• отрицательный аргумент функции SQRT (извлечение квадратного корня);
• аргумент функции LN (логарифм) равен нулю или имеет отрицательное значение;
• произошло переполнение стека сопроцессора.
Самое простое это поставить BrekPoint и смотреть пошагово.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 10.06.2011, 15:35   #3
hottabi4
 
Регистрация: 10.06.2011
Сообщений: 5
По умолчанию

делал, при i=10 j=11 ошибка.
з.ы. кто знает вышку, проверьте пожалуйста код на правильность вычисления и построения графиков.
hottabi4 вне форума Ответить с цитированием
Старый 10.06.2011, 19:00   #4
hottabi4
 
Регистрация: 10.06.2011
Сообщений: 5
По умолчанию

вот немного переписанный код, но все равно такая же ошибка

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TeEngine, Series, ExtCtrls, TeeProcs, Chart, Grids;

type
  TForm1 = class(TForm)
    Chart1: TChart;
    Series1: TLineSeries;
    Series2: TLineSeries;
    Chart2: TChart;
    Series3: TLineSeries;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const n=11;

var
  Form1: TForm1;
  i,j: integer;
  xn,xf: array [-10..10] of real;
  l: array [0..300] of real;
implementation

{$R *.dfm}

function lagrang(x:real):real;
var
  i,j:integer;
  f,d: real;
begin

  d:=1;
  for i:=0 to 20 do
    begin
      xf[i]:=xf[i-1]+d;
      l[i]:=3*xf[i]*xf[i]+2*xf[i]+14;
    end;

  result:=0;
  for i:=0 to n do
  begin
    f:=l[i];
    for j:=0 to n do
      begin
        if i<>j then
          f:=f*((x-xn[i])/(xn[j]-xn[i]));
      result:=result+f;
      end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var x,y,yp: real;
    b,d: real;
begin

x:=-10;
while x<10 do
begin
  Series1.AddXY(x,y);
  x:=x+0.001;
  y:=3*x*x+2*x+14;
 end;

d:=1;
for i:=0 to 20 do
  begin
    xf[i]:=xf[i-1]+d;
    l[i]:=3*xf[i]*xf[i]+2*xf[i]+14;
  end;

for i:=0 to n do
begin
   x:=xf[i];
   y:=l[i];
   b:=xf[i+1];
   while x<b do
   begin
   //полином
     Series2.AddXY(x,y);
     x:=x+0.001;
     y:=lagrang(x);
   //погрешность
     Series3.AddXY(x,yp);
     yp:=abs(l[i]-lagrang(x));
   end;
end;

end;

end.
hottabi4 вне форума Ответить с цитированием
Старый 10.06.2011, 19:02   #5
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Единственный способ найти эту ошибку это:

Цитата:
поставить BrekPoint и смотреть пошагово.
Нет смысла приводить листинг и спрашивать что не так.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
где ошибка в коде ?не могу понять Qiper Общие вопросы C/C++ 26 02.04.2012 21:19
не могу понять где ошибка Neon-z PHP 13 22.01.2011 16:15
Не могу понять, где ошибка( IROKEZ Общие вопросы C/C++ 4 16.12.2010 21:00
Помогите разобраться в коде не погу понять где ошибка wagonwils Общие вопросы C/C++ 0 23.12.2009 21:02
Не могу понять где ошибка в коде SeRhy Общие вопросы C/C++ 5 20.09.2009 13:10