Witam wszystkich.
Mam pewien kłopocik odnośnie precyzji liczb typu Real. Zaznacze na wstępie że używam Delphi 4 Standard. W helpie jest informacja że liczy te są zapisywane z precyzją 15-16 cyfr ... co to tak naprawde znaczy ? Że raz jest 15 a raz 16 - ale kiedy ? Pisze pewien większy program i ostatnio nie mogłem wyjaśnić pewnej sprawy. Wynik ścisłego obliczenia był różny z zależności od tego czy wszceśniej uruchomiłem przeglądarkę czy nie. Obliczenia są proste, chodzi o pole powierzchni metodą Gauss'a - jest to bardzo szybka metoda - dlatego chciałem jej użyć. Problem w tym że operuje na współrzędnych punktów takich jak: 5683234,123 a we wzorze występuje iloczyn współrzędnych : ). Ale do rzeczy, dołączam źródło programu napisanego na potrzeby demonstracji problemu. U mnie na komputerze program działa następująco:
- po uruchomieniu naciskam przycisk Button1 i otrzymuje wynik:
26.702977180481 - następnie naciskam Button2 i znowu Button1 i otrzymuje wynik:
26.697265625
(Button2 uruchamia przeglądarke)
Ma to być pole trójkąta liczone ze współrzędnych. Pierwszy wynik jest poprawny drugi jest taki jakby liczyć go ze zmnieszoną precyzją (do 15 cyfr). Ale dlaczego tak się dzieje ???
Pozdrawiam i z góry dziękuje za odpowiedzi (szczególnie za wyniki jakie otrzymacie).
Kod programu:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ShellApi;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
X1, X2, X3, Y1, Y2, Y3 : Real;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := Floattostr(0.5*Abs(X2*Y3 + Y2*X1 + X3*Y1 - Y3*X1 - Y2*X3 - Y1*X2));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
X1 := 5682743.89;
Y1 := 3812665.525;
X2 := 5682758.442;
Y2 := 3812668.981;
X3 := 5682744.589;
Y3 := 3812662.021;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShellExecute(Application.Handle,'open','http://4programmers.net',nil,nil,SW_MAXIMIZE);
end;
end.