![]() |
Gleitkommaüberlauf
Beispiel:
Soll mit folgenden Step (2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4) durchlaufen werden..
Delphi-Quellcode:
bekomme aber immer einen Gleitkommaüberlauf woran könnte es liegen?
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; Ich gehe eigentlich davon aus das diese Abfrage genau das tut was ich oben als Beispiel angegeben habe.
Delphi-Quellcode:
gruss
if (i mod ie) <> 0 then
continue; |
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. |
AW: Gleitkommaüberlauf
Zitat:
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 |
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. |
AW: Gleitkommaüberlauf
Zitat:
Der FFT läuft in einer Subclass also in MS Bereich. gruss |
AW: Gleitkommaüberlauf
Habe mal einen einfachen outputdebugstring genommen.
Delphi-Quellcode:
eigentlich sollte man davon ausgehen das wenn die abfrage nach "i mod ie" erfolgt outputdebugstring > 0 ausgeben sollte.
for i := j to (FFFTSize - 1) do
begin if (i mod ie) <> 0 then continue; outputdebugstring(PWideChar(IntToStr(i mod ie))); 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 16:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz