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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.11.2016, 18:13   #1
furgingerbread
Пользователь
 
Регистрация: 14.11.2016
Сообщений: 12
По умолчанию Delphi 7 Floating Point overflow

Доброго времени суток.

Задача: написать программу, которая включает в себя табулирование функции и численное интегрирование с выводом графика функции и результатов в таблицу.

Проблема: при нажатии кнопки "Выполнить" возникает ошибка project raised exeption class EOverflow with message Floating Point overflow

Подскажите, как сделать так, чтобы полученные значения выводились в таблицу и строился график?

Спасибо.

Код:
unit RGR;

interface

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


type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    StringGrid1: TStringGrid;
    Chart1: TChart;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Label20: TLabel;
    Series1: TLineSeries;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.Button2Click(Sender: TObject); // Кнопка очистить
begin
Edit1.Text:=''; Edit2.Text:='';
Edit3.Text:=''; Edit4.Text:='';
Edit5.Text:='';Edit6.Text:='';
Edit7.Clear;Edit8.Clear;Edit9.Clear;
Edit10.Clear; Edit1.SetFocus;
end;
procedure FreeStringGrid1; // очистка ячеек StringGrit1
var
I, J: integer;
begin
 for I:=0 to 20 do
  begin
   for J:=1 to 20 do
     begin
       Form1.StringGrid1.Cells[I,J]:='';
     end;
   end;
end;

var N:integer;
 const Nmax = 20;
 type
   Tmy = Array[1..Nmax, 1..Nmax] of Extended;
   Tmx = Array[1..Nmax] of Extended;
   TEr = Array[1..Nmax] of Integer;
 var
 Ax,Mx: Tmx;
 My: Tmy;
 Xn,Dx,Int,C,D,Eps,An,Ak,Da: Extended;
 L,Km,ErrorHappened:Integer;
procedure TForm1.Button1Click(Sender: TObject); // кнопка "Выполнить"


 // процедура обработки ошибок
 procedure ProcErrorHappened(ErrorHappened: integer);
 begin
  case ErrorHappened of
  1: begin
  ShowMessage('Аргумент меньше или равен нулю');
     exit;
 end;
 end;
 end;

// численное интегрирование
procedure ChisInt(C, D, Eps: Extended; Km : integer; var Int: extended);
var I, J, K: integer;
Y1, Yn, S4, S2, h, Del, int1, x: extended;
function F(x: Extended): Extended;
begin
F:=sqr(x)*ln(x)
end;
begin
Y1:= F(D);
Yn:= F(C);
Int1:=0;
K:= 2;
J:=1;
X:= D;
if (x > 0) then
 begin
 while(J<=Km) do
  begin
  h:=(C - D)/k;
  X:= D + H;
  Int:= 0;
  Int1:=0;
  I:=1;
  S4:=0;
  S2:= 0;
  repeat
  if ODD(I) then
  S4:=S4 + F(x)
  else
  S2:= S2+F(x);
  Int1:= 4*S4 + 2*S2;
  x:= x + H;
  I:= I + 1;
 until (I >= K);
 Int:=(Y1 + YN + Int1)*(H/3);
 Del:= abs(Int1 - Int);
 If (Del < Eps) then
 begin
 Int1:= Int;
 K:= K*2
 end
 else
 begin
 J:= Km;
 end;
 J:= J + 1;
 end;
 end
 else
 ErrorHappened:= 1;
 end;

procedure Tab(Int, Xn, Dx, An, Ak, Da: Extended; N: Integer; var ErrorHappened: integer;
var Mx, Ax:Tmx; var My:Tmy);   // табулирование функции
var
I,J: integer;
X, Y, A: Extended;

begin
   I:= 1;
   A:= An;
 while(A <= Ak) do
 begin
 X:=Xn;
 for J:= 1 to N do
   begin
     if X <> 0 then
      begin
       Y:= A*exp(-Int*x)*(cos(0.5*x) - 3*sin(2*x))/(6*x);
       My[I, J]:= Y;
       end
      else
       begin
       ErrorHappened:= 1;
       end;
      Mx[J]:= X;
      X:= X + Dx;
      end;
      Ax[I]:= A;
      A:= A + Da;
      Inc(I);
   end;
end;
// Процедура вывода результата
procedure RezOut(var Mx, Ax: Tmx; var My: Tmy);
var
 I,J:integer;
begin
 for I:= 1 to L do
  begin
   StringGrid1.Cells[I,0]:=('A['+IntToStr(I)+']='+FloatToStr(Ax[I]));
   Form1.Chart1.Series[0].Clear;
   for J:=1 to N do
    begin
     if(StringGrid1.ColCount < J + 1) then
      StringGrid1.ColCount:=StringGrid1.ColCount + 1;
       StringGrid1.Cells[0,J]:=('X['+IntToStr(J)+']='+FloatToStr(Mx[J]));
       Form1.Chart1.Series[0].AddXY(Mx[J],My[I,J]);
      StringGrid1.Cells[I,J]:=FloatToStrF(My[I,J],ffGeneral,6,5);
    end;
    if(StringGrid1.RowCount < I) then
       StringGrid1.RowCount:=StringGrid1.RowCount +1;
 end;
end;

begin
 // исходные данные для интегрирования
C:=StrToFloat(Edit2.Text);
D:=StrToFloat(Edit3.Text);
Km:=StrToInt(Edit5.Text);
// исходные данные для табулирования
Xn:= StrToFloat(Edit6.Text);
Dx:= StrToFloat(Edit8.Text);
N:= StrToInt(Edit7.Text);
An:= StrToFloat(Edit8.Text);
Ak:= StrToFloat(Edit9.Text);
Da:= StrToFloat(Edit10.Text);


// формирование заголовков таблицы
StringGrid1.Cells[0,0]:='N';
StringGrid1.Cells[1,0]:='A';
// Очистка ячеек StringGrid
FreeStringGrid1;
// вызов ПП ChisInt
ChisInt(C, D, Eps, Km, Int);
 // вызов ПП Tab
 Tab(Int, Xn, Dx, An, Ak, Da, N,ErrorHappened, Mx, Ax, My);
L:= trunc((Ak - An)/Da +1); // выделяет строчку как ошибку
 RezOut(Mx, Ax, My);
end;

procedure TForm1.Button3Click(Sender: TObject); // кнопка "Закрыть"
begin
close;
end;
end.
furgingerbread вне форума Ответить с цитированием
Старый 21.11.2016, 20:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
как сделать так, чтобы полученные значения выводились в таблицу и строился график
Ставить бряки и в отладчике вычислять где и почему переполнение
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Камера c++. Матрица 1000х1000. Floating point overflow cripple_nipple Помощь студентам 7 08.04.2015 17:13
floating point overflow в delphi gylayko Помощь студентам 2 14.09.2012 17:34
floating point overflow awzq Общие вопросы C/C++ 2 05.09.2012 13:54
Floating point overflow Ania Lunee Помощь студентам 4 18.05.2012 22:01
Delphi, "Floating point overflow" что делать? xMass Помощь студентам 12 02.04.2009 01:37