Thema: Buddhabrot

Einzelnen Beitrag anzeigen

Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: Buddhabrot

  Alt 10. Okt 2005, 20:16
Zitat:
Delphi-Quellcode:
c.x := c.x * c.x - c.y * c.y;
c.y := 2 * c.x * c.y;
So wird das aber nichts :
Delphi-Quellcode:
TempX := z.x;
z.x := z.x * z.x - z.y * z.y;
z.y := 2 * TempX * z.y;
Ich habe mir mal eine Testanwendung geschrieben, im Schnitt kamen überall etwa die gleichen Zeiten heraus (CSqr eher langsamer).
Delphi-Quellcode:
function sqrC(const C: TComplex): TComplex;
const two: double = 2.0;
asm
  fld C.x;
  fmul C.x;
  fld C.y;
  fmul C.y;
  fsubp;
  fstp result.x;

  fld C.x;
  fmul C.y;
  fmul two;
  fstp result.y;
end;

function CSqr(const C: TComplex): TComplex; inline;
begin
  Result.x := Sqr(C.x) - Sqr(C.y);
  Result.y := 2 * C.x * C.y;
end;

procedure CSqr2(var C: TComplex); inline;
var
  TempX: Single;
begin
  TempX := C.x;
  C.x := C.x * C.x - C.y * C.y;
  C.y := 2 * TempX * C.y;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Start: Cardinal;
  i, ii: Integer;
  TempX: Single;
  z: TComplex;
begin
  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
      z := sqrC(z);
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
      z := CSqr(z);
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
    begin
      TempX := z.x;
      z.x := z.x * z.x - z.y * z.y;
      z.y := 2 * TempX * z.y;
    end;
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

  Start := GetTickCount;
  for ii := 0 to 1000000 do
  begin
    z.x := Sqrt(0.5);
    z.y := Sqrt(0.5);
    for i := 0 to 50 do
      CSqr2(z);
  end;
  ShowMessage(Format('%d', [GetTickCount - Start]));

end;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat