Пользователь
Регистрация: 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.
|