![]() |
Logarithmus Log zu Delphi
Habe leider immer wieder Geleitkommaüberläufe.
Der Ausgang..
Code:
das ganze nach Delphi
b ist Long..
b = (Log(Sqr(Spectrum(i1).r * Spectrum(i1).r + Spectrum(i1).i * Spectrum(i1).i) + 0.0001) + 9.21034037197618) * q1
Delphi-Quellcode:
bin mir aber nicht sicher ob LN der richtige Datentyp ist.
b: Single;
b := (LN(Sqr(Spectrum[i1].r * Spectrum[i1].r + Spectrum[i1].i * Spectrum[i1].i) + 0.0001) + 9.21034037197618) * q1; Alternativen Wenn nicht? Keine Ahnung wie ich die Ergebnisse wenn -NAN, +NAN abfangen soll. Ungültige Gleitkomma Operationen. grrr... Muss dabei sagen das ich kein Mathe experte bin.. gruss |
AW: Logarithmus Log zu Delphi
Ich habe Delphi noch nicht gestartet, aber ist das Ergebnis nicht vom Typ Extended?
|
AW: Logarithmus Log zu Delphi
Hallo,
Zitat:
![]() |
AW: Logarithmus Log zu Delphi
Zitat:
Delphi-Quellcode:
es nutzt nur nichts deshalb wieder aus kommentiert.
constructor TSpectrum.Create;
begin // Saved8087CW := Default8087CW; // Set8087CW($133f); FFFTSize := 2048; FFTLog := 11; end; try except auch nicht! sobald ich hier abfrage
Delphi-Quellcode:
b := (LN(Sqr(Spectrum[i1].r * Spectrum[i1].r + Spectrum[i1].i * Spectrum[i1].i) + 0.0001) + 9.21034037197618) * q1;
und die Rückgabe +NAN oder -NAN ist dann kracht es. gruss |
AW: Logarithmus Log zu Delphi
sqr in Visual basic -> Square root , also Quadrat Wurzel
sqr in Delphi -> Square -> Quadratzahl sqrt in Delphi -> Square root Quelle: ![]() Grüße Klaus |
AW: Logarithmus Log zu Delphi
Zitat:
Was ist mit LN? Danke! gruss |
AW: Logarithmus Log zu Delphi
|
AW: Logarithmus Log zu Delphi
Zitat:
![]() In Delphi code, Ln returns the natural logarithm (Ln(e) = 1) of the real-type expression X. Grüße Klaus |
AW: Logarithmus Log zu Delphi
Zitat:
Leider habe ich trotzdem das Problem mit -NAN obwohl ich schon den Überlauf prüfe.
Delphi-Quellcode:
Schlage mich damit jetzt schon ein paar Tage mit rum. ;)
function LimitedSingleValue(doubleVal: double): single;
begin if doubleVal > MaxSingle then result := MaxSingle else if doubleVal < MinSingle then result := MinSingle else result := doubleVal; end; Also wenn an doubleVal der wert -NAN ankommt dann kracht es trotzdem. Zitat:
gruss |
AW: Logarithmus Log zu Delphi
.. du könntest zusätzlich auf isNAN testen.
Grüße Klaus |
AW: Logarithmus Log zu Delphi
Eventuell führst Du nicht alles in einem Schritt durch, sondern ziehst erst die Wurzel und schaust, ob da ein "ln-taugliches" Ergebnis raus kommt (zumindest mal positiv).
Sherlock |
AW: Logarithmus Log zu Delphi
Zitat:
Zitat:
Delphi-Quellcode:
gruss
procedure TSpectrum.FFT(Dat: array of TComplex);
var i, j, n, K , io, ie, in_, nn: Integer; u, tp, tq, w: TComplex; sr, mGain: Single; function LimitedSingleValue(doubleVal: double): single; begin if doubleVal > MaxSingle then result := MaxSingle else if doubleVal < MinSingle then result := MinSingle else result := doubleVal; end; begin if not FFTInit then begin InitFFT; FFTInit := True; end; nn := FFFTSize div 2; 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_; if (i >= (FFFTSize - 1)) or (io >= (FFFTSize - 1)) then continue; tp.r := LimitedSingleValue(Dat[i].r + Dat[io].r); tp.i := LimitedSingleValue(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 := LimitedSingleValue(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; j := 1; for i := 1 to (FFFTSize - 1) do begin if i < j then begin io := i - 1; in_ := j - 1; tp := Dat[in_]; Dat[in_] := Dat[io]; Dat[io] := tp; end; K := nn; While K < j do begin j := j - K; K := K div 2; end; j := j + K; end; mGain := (FGain / 100); if FView = 0 then sr := (4096 * mGain) / FFFTSize else sr := 1 / FFFTSize; for i := 0 to (FFFTSize div 2) - 1 do begin Dat[i].r := Dat[i].r * sr; Dat[i].i := Dat[i].i * sr; end; end; |
AW: Logarithmus Log zu Delphi
Zitat:
Delphi-Quellcode:
b := (LN(Sqrt(sqr(Spectrum[i1].r) + sqr(Spectrum[i1].i)) + 0.0001) + 9.21034037197618) * q1;
In Prinzip kann das ganze nur negativ werden wenn q1 < 0 ist. LN bekommt immer ein positiven Wert gebildet aus: sqrt(sqr(Spectrum[i1].r) + sqr(Spectrum[i1].i)) + 0.0001 Grüße Klaus |
AW: Logarithmus Log zu Delphi
Zitat:
Delphi-Quellcode:
gruss
i1 := 1;
q2 := 0; q1 := 0; case View of 0: begin for o := 0 to FOctaveCount - 1 do begin fl := True; q2 := q2 + OctAreaSize; i2 := i1 * 2; While i1 < i2 do begin b := round(Sqrt(Spectrum[i1].r * Spectrum[i1].r + Spectrum[i1].i * Spectrum[i1].i)); if b > 255 then b := 255; GDIP_SetPenColor(Pen, Palette[round(b)]); if MapData[i1].IsLine then begin if not fl then begin GDIP_SetPenWidth(Pen, 1); fl := True; q1 := q1 + 4; q2 := q2 + 2; GDIP_DrawLine(grSpectrum, Pen, MapData[i1].fa * q1 + Sw, MapData[i1].ta * q1 + Sh, MapData[i1].fa * q2 + Sw, MapData[i1].ta * q2 + Sh); end; end else begin if fl then begin GDIP_SetPenWidth(Pen, OctAreaSize - 2); fl := False; GDIP_DrawArc(grSpectrum, Pen, Sw - q2, Sh - q2, q2 * 2 - 1, q2 * 2 - 1, MapData[i1].fa, MapData[i1].ta); end; end; i1 := i1 + 1; end; q1 := q1 + OctAreaSize; end; end; |
AW: Logarithmus Log zu Delphi
Stimmt, und das ist nach dem ln.
Also muß man prüfen, ob da Extremwerte rauskommen, die der ln nicht verkraftet. Leider ist die Doku da sehr dünn, und ich habe vom ln an sich zu wenig Ahnung. Sherlock |
AW: Logarithmus Log zu Delphi
.. wie groß können denn Spectrum[i1].r und Spectrum[i1].i maximal werden?
wenn die gegen 0 gehen wird der ln von .0001 gebildet -> -9.2103403719761827360719658187375 Grüße Klaus |
AW: Logarithmus Log zu Delphi
Zitat:
Fand das Original nicht schlecht und wollte es halt mal nach Delphi umsetzen (Nebenbei Vaporware ist das nicht) zu viel Aufwand wie man sehen kann. Und man kann von lernen. ;) Mein Hauptproblem zur zeit ist das der Linker mich einfach rausschmeißt.
Delphi-Quellcode:
procedure TSpectrum.FFT(Dat: array of TComplex);
var i, j, n, K , io, ie, in_, nn: Integer; u, tp, tq, w: TComplex; sr, mGain: Single; function LimitedSingleValue(doubleVal: double): single; stdcall; begin if doubleVal > MaxSingle then result := MaxSingle else if doubleVal < MinSingle then result := MinSingle else result := doubleVal; end; begin Der linker entfernt variablen.
Delphi-Quellcode:
hier FFFTSize.
mGain := (FGain / 100);
if FView = 0 then sr := (4096 * mGain) / FFFTSize else sr := 1 / FFFTSize; EurekaLog springt dann mit einem Access Violation auf das letzte end im oberen Quelltext. Mit der Meldung vom Speicher kann nicht gelesen werden. Da ist einiges im argen. Zitat:
Wenn Interesse besteht kann ich den Quelltext zum debuggen aber gerne mal hochladen. Oder ich schicke einen Link per PN. gruss |
AW: Logarithmus Log zu Delphi
Nur 'ne blöde Idee, ein Schuss ins Blaue:
Mach' bitte mal aus
Delphi-Quellcode:
dashier:
mGain := (FGain / 100);
if FView = 0 then sr := (4096 * mGain) / FFFTSize else sr := 1 / FFFTSize;
Delphi-Quellcode:
Geht das und ändert sich dann was?
mGain := (FGain / 100);
sr := IfThen(FView = 0, 4096 * mGain, 1) / FFFTSize; |
AW: Logarithmus Log zu Delphi
Delphi-Quellcode:
IfThen(FView = 0, (4096 * mGain) / FFFTSize, 1);
Ist am ende das gleiche oder? Das Ergebnis ist das gleiche. Habe es versucht. Danke. gruss |
AW: Logarithmus Log zu Delphi
nicht ganz:
entweder
Delphi-Quellcode:
IfThen(FView = 0, (4096 * mGain) / FFFTSize, 1 / FFFTSize);
oder
Delphi-Quellcode:
IfThen(FView = 0, (4096 * mGain), 1) / FFFTSize;
Im ursprünglichen Quelltext findet für sr ja auch im Else noch eine Division durch FFFTSize statt, muss also im IfThen entweder in beiden Fällen durchgeführt werden oder auf das Ergebnis von IfThen. |
AW: Logarithmus Log zu Delphi
Delphi-Quellcode:
IfThen(FView = 0, (4096 * mGain), 1) / FFFTSize;
Sorry aber das funktioniert nicht weil IFThen so nicht ausgelegt ist. Zitat:
gruss |
AW: Logarithmus Log zu Delphi
Ok, dann gibt es keine überladene Version von IfThen für den passenden Datentypen. Schade.
|
AW: Logarithmus Log zu Delphi
Was passiert, wenn du deine Formel
Delphi-Quellcode:
Schritt für Schritt auswertest?
c := 0.0001;
d := -ln(c); ... b2 := (ln(Sqrt(r * r + i * i) + c ) + d ) * q1; Also so:
Delphi-Quellcode:
c := 0.0001;
d := -ln(c); ... b := Sqrt(r * r + i * i); b := ln( b + c ); b := b + d; b := b*q1; Wo haut's dich da raus? Nebenbei: Wenn du statt d := 9.21034037197618; (als single Wert speichert Delphi 9.21034049987793) d := -ln(0.0001); verwendest, dann wird b oben für r=i=0 wie gewünscht 0 [auch wenn du dich später für "double" entscheiden solltest]. Man darf es Resultatkosmetik nennen... :) |
AW: Logarithmus Log zu Delphi
Zitat:
Danke für die Info. Das nachträglich zurücksetzen ist kein Problem wenn es dann läuft. Zitat:
gruss |
AW: Logarithmus Log zu Delphi
Step by Step solltest du rasch sehen, wo's daneben geht.
...und... d := -ln(0.0001) und deine Konstante 9.21034037197618 (wird gespeichert als 9.21034049987793) sind - solange du alle drei als Single verwendest - gleich. Der Absturz rührt also sicher nicht daher. d := -ln(0.0001) spiegelt einfach den "Sinn" der Formel wieder: ¦Spektrum=0¦ muss Nullstelle sein von b(Spektrum,q1). |
AW: Logarithmus Log zu Delphi
Zitat:
![]() case 0 für die Kreis Visualisierung dann startet die Anwendung aber wird nix visualisiert. Irgendwo da liegt der Fehler für den Kreis bei case 1 das gleiche. Muss mich da durch steppen. PS: Eigentlich müsste b = 0 sein wenn kein Sound wieder gegeben wird ist aber bei weitem höher. gruss |
AW: Logarithmus Log zu Delphi
Ja dann hast du irgendwo sonst ein Problem in deinem Code. Denn b
Delphi-Quellcode:
ist ja genau so gebaut, dass b=0 für ¦Spektrum¦=sqrt(r*r+i*i)=0.
c := 0.0001;
d := -ln(c); b := (ln(Sqrt(r * r + i * i) + c ) + d ) * q1; ¦Spektrum¦=0 in b eingesetzt: b = (ln(0+c) - ln(c))*q1 = 0*q1 = 0 |
AW: Logarithmus Log zu Delphi
Zitat:
Bekomme ich einen Stacküberlauf. Ich glaube das Teil ist einfach zu hoch für mich. (Mir fehlt die höhere Mathematik um die Probleme lösen zu können) Edit wurde zur Seite gelegt im Moment keinen Bock mehr. Danke für die Hilfe. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 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