Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Gleitkommaüberlauf (https://www.delphipraxis.net/200076-gleitkommaueberlauf.html)

EWeiss 17. Mär 2019 13:48

Gleitkommaüberlauf
 
Beispiel:
Soll mit folgenden Step (2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4) durchlaufen werden..


Delphi-Quellcode:
  ie := FFFTSize;
  for n := 1 to FFTLog do
  begin
    w := Coef[FFTLog - n];
    in_ := ie div 2;
    u.r := 1;
    u.i := 0;

    for j := 0 to (in_ - 1) do
    begin
      for i := j to (FFFTSize - 1) do
      begin
        if (i mod ie) <> 0 then
          continue;

        io := i + in_;

        tp.r := Dat[i].r + Dat[io].r;
        tp.i := Dat[i].i + Dat[io].i;

        tq.r := Dat[i].r - Dat[io].r;
        tq.i := Dat[i].i - Dat[io].i;

        Dat[io].r := tq.r * u.r - tq.i * u.i;
        Dat[io].i := tq.i * u.r + tq.r * u.i;
        Dat[i] := tp;
      end;

      sr := u.r;
      u.r := u.r * w.r - u.i * w.i;
      u.i := u.i * w.r + sr * w.i;
    end;
    ie := ie div 2;
  end;
bekomme aber immer einen Gleitkommaüberlauf woran könnte es liegen?
Ich gehe eigentlich davon aus das diese Abfrage genau das tut was ich oben als Beispiel angegeben habe.
Delphi-Quellcode:
if (i mod ie) <> 0 then
  continue;
gruss

TurboMagic 17. Mär 2019 14:47

AW: Gleitkommaüberlauf
 
Schon mal die Zwischenwerte irgendwie mit geloggt? (z.B. mit CodeSite)
Dadurch käme man evtl. dahinter welcher der Werte überläuft. Dessen Berechnung könnte man
sich dann mal näher anschauen.

EWeiss 17. Mär 2019 14:51

AW: Gleitkommaüberlauf
 
Zitat:

Zitat von TurboMagic (Beitrag 1427924)
Schon mal die Zwischenwerte irgendwie mit geloggt? (z.B. mit CodeSite)
Dadurch käme man evtl. dahinter welcher der Werte überläuft. Dessen Berechnung könnte man
sich dann mal näher anschauen.

Den Punkt kenne ich kann nur nicht ermitteln welcher Fehler hier auftritt.
Weil das Programm zu dem Zeitpunkt dann nicht mehr aktiv ist.

Delphi-Quellcode:
tp.r := Dat[i].r + Dat[io].r;


PS:
Kann weder zu diesen Zeitpunkt etwas loggen noch nutzt es etwas wenn ich mit der Maus irgendwo drüberfahre.
Es werden keinerlei werte mehr angezeigt.

gruss

Daniel 17. Mär 2019 15:41

AW: Gleitkommaüberlauf
 
Warum lässt sich das nicht loggen?
Etwas ganz Brachiales wie das Wegschreiben in eine Datei wird doch immer gehen? Elegant geht gewiss anders, aber damit hättest Du vermutlich schnell einen Überblick über die Werte zu den jeweiligen Schleifendurchläufen.

EWeiss 17. Mär 2019 15:47

AW: Gleitkommaüberlauf
 
Zitat:

Zitat von Daniel (Beitrag 1427927)
Warum lässt sich das nicht loggen?
Etwas ganz Brachiales wie das Wegschreiben in eine Datei wird doch immer gehen? Elegant geht gewiss anders, aber damit hättest Du vermutlich schnell einen Überblick über die Werte zu den jeweiligen Schleifendurchläufen.

Ich kann es versuchen aber wie ich schon sagte wenn das Problem auftritt gibt es keine verwertbaren Daten mehr.
Der FFT läuft in einer Subclass also in MS Bereich.

gruss

EWeiss 17. Mär 2019 16:19

AW: Gleitkommaüberlauf
 
Habe mal einen einfachen outputdebugstring genommen.

Delphi-Quellcode:
for i := j to (FFFTSize - 1) do
begin
  if (i mod ie) <> 0 then
    continue;

  outputdebugstring(PWideChar(IntToStr(i mod ie)));
eigentlich sollte man davon ausgehen das wenn die abfrage nach "i mod ie" erfolgt outputdebugstring > 0 ausgeben sollte.
Seltsamer weise ist es aber immer 0.
Oder verdrehe ich da was.

Hmmm…
OK habe es verdreht 0 ist richtig. Muss mich da selber durchbeißen.. Danke.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz