mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-13 22:50:30 +02:00
improved version of mandelbrot benchmark, uses now sse2 exclusively.
git-svn-id: trunk@9615 -
This commit is contained in:
parent
eddde27b0b
commit
4958973566
@ -9,59 +9,64 @@ program mandelbrot;
|
||||
|
||||
{$FPUTYPE SSE2}{$I-}
|
||||
|
||||
var n, x, y, bits,bit: Longint;
|
||||
Cx, Cy: double;
|
||||
var n: longint;
|
||||
TextBuf: array[0..$FFF] of byte;
|
||||
OutFile: PText;
|
||||
|
||||
|
||||
procedure CalculatePoint; nostackframe;
|
||||
const
|
||||
Limit: double =4.0;
|
||||
zero: double = 0.0;
|
||||
procedure run;
|
||||
var
|
||||
i: longint;
|
||||
OutOfLimit: boolean;
|
||||
Cr, Ci, Zr, Zi, Ti, Tr: Double;
|
||||
|
||||
begin
|
||||
Cr := Cx; Ci := Cy;
|
||||
Zr := zero; Zi := zero; Tr := zero; Ti := zero;
|
||||
i := 0;
|
||||
repeat
|
||||
Zi := 2*Zr*Zi + Ci;
|
||||
Zr := Tr - Ti + Cr;
|
||||
Ti := Zi * Zi;
|
||||
Tr := Zr * Zr;
|
||||
inc(i);
|
||||
OutOfLimit := (Tr + Ti>=limit);
|
||||
until OutOfLimit or (i=50);
|
||||
Cy, Step: double;
|
||||
x, y, bits,bit: Longint;
|
||||
function CalculatePoint(Cx, Cy: double): boolean; nostackframe; inline;
|
||||
const
|
||||
Limit = 4;
|
||||
var
|
||||
i: longint;
|
||||
Zr, Zi, Ti, Tr: Double;
|
||||
|
||||
if OutOfLimit then
|
||||
bits := bits xor bit;
|
||||
end;
|
||||
begin
|
||||
Zr := 0; Zi := 0; Tr := 0; Ti := 0;
|
||||
for i := 1 to 50 do begin
|
||||
Zi := 2*Zr*Zi + Cy;
|
||||
Zr := Tr - Ti + Cx;
|
||||
Ti := Zi * Zi;
|
||||
Tr := Zr * Zr;
|
||||
if (Tr + Ti>=limit) then exit(true);
|
||||
end;
|
||||
|
||||
{$FPUTYPE X87}
|
||||
CalculatePoint := false;
|
||||
end;
|
||||
|
||||
begin
|
||||
Val(ParamStr(1), n);
|
||||
writeln('P4');
|
||||
writeln(n,' ',n);
|
||||
Step := 2/n;
|
||||
for y := 0 to n-1 do
|
||||
begin
|
||||
Cy := y * 2 / n - 1;
|
||||
Cy := y * Step - 1;
|
||||
bits := 255; bit := 128;
|
||||
for x := 0 to n-1 do
|
||||
begin
|
||||
Cx := x * 2 / n - 1.5;
|
||||
|
||||
CalculatePoint;
|
||||
if CalculatePoint(x * Step - 1.5, Cy) then
|
||||
bits := bits xor bit;
|
||||
|
||||
if bit > 1 then
|
||||
bit := bit shr 1
|
||||
else
|
||||
begin
|
||||
write(chr(bits));
|
||||
write(OutFile^, chr(bits));
|
||||
bits := 255; bit := 128;
|
||||
end;
|
||||
end;
|
||||
if bit < 128 then write(chr(bits xor((bit shl 1)-1)));
|
||||
if bit < 128 then write(OutFile^, chr(bits xor((bit shl 1)-1)));
|
||||
end;
|
||||
end;
|
||||
|
||||
begin
|
||||
OutFile := @Output;
|
||||
SetTextBuf(OutFile^, TextBuf);
|
||||
|
||||
Val(ParamStr(1), n);
|
||||
writeln(OutFile^, 'P4');
|
||||
writeln(OutFile^, n,' ',n);
|
||||
run;
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user