Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit (https://www.delphipraxis.net/208330-float_invalid_operation-und-float_overflow-nur-64bit.html)

venice2 16. Jul 2021 17:17

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Zitat:

Vielleicht stehen unter 32 Bit an den Adressen außerhalb der Arrays 0 Werte und unter 64 Bit z.B. NaNs.
Dann hättest du unter 32 Bit zwar fehlerhafte Ergebnisse aber keine Exeptions, unter 64 Bit dagegen würden dann Exceptions ausgelöst.
Das mag sein.
Danke für deine Ausführliche Erklärung.
Werde es mal testen.

EDIT:
Nein geht nicht hatte das Extended noch definiert.
Kommen die gleichen Fehler mit Single.

Habe deine Änderung trotzdem belassen da es mir schlüssig erscheint. Danke!

brechi 16. Jul 2021 19:53

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Hast du denn mal den rangecheck eingebaut?

venice2 16. Jul 2021 19:58

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Zitat:

Zitat von brechi (Beitrag 1492442)
Hast du denn mal den rangecheck eingebaut?

Das sind Grundvoraussetzungen. :wink:

brechi 16. Jul 2021 20:06

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Delphi-Quellcode:
//...
ip := Q + (le1 - 1);

          if ip > High(fi) then //rangecheck
            raise Exception.Create('Fehler');
          if ip > High(FR) then
            raise Exception.Create('Fehler');

          tr := FR[ip] * ur - FI[ip] * ui; // FLOAT_INVALID_OPERATION nur 64Bit
          ti := FR[ip] * ui + FI[ip] * ur;
Läuft das bei dir durch, oder wird ein Fehler angezeigt?

venice2 16. Jul 2021 20:15

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Zitat:

Zitat von brechi (Beitrag 1492444)
Delphi-Quellcode:
//...
ip := Q + (le1 - 1);

          if ip > High(fi) then //rangecheck
            raise Exception.Create('Fehler');
          if ip > High(FR) then
            raise Exception.Create('Fehler');

          tr := FR[ip] * ur - FI[ip] * ui; // FLOAT_INVALID_OPERATION nur 64Bit
          ti := FR[ip] * ui + FI[ip] * ur;
Läuft das bei dir durch, oder wird ein Fehler angezeigt?

Falls hier ein Fehler auftreten sollte und ich habe unter den Option die Bereichsprüfung eingeschaltet dann sollte der Debugger einen Fehler melden oder?
Aber ich kann es auch mal auf diese weise versuchen. Danke!

Das ist was ich meinte mit Grundvoraussetzung.

EDIT:
Aber der rangecheck hat nichts mit FLOAT_INVALID_OPERATION zu tun oder?
Habe es versucht.
FLOAT_INVALID_OPERATION kommt trotzdem auch mit deinem rangecheck

brechi 16. Jul 2021 20:42

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Die Frage ist, ob die die Range-Prüfung ausgelöst wird. Wenn FLOAT_INV.. vorher kommt, liegt es zumindest nicht daran, dass du auf einen ungültigen Speicherbereich zugreift.
Wenn du auf Speicherbereich nach dem Array zugreift würdest, dann kann dadurch schon der Fehler FLOAT_INV ausgelöst werden, je nachdem was dort steht.
Da wie bereits erwähnt ein array of single bei 0 startet müsste auch sample bei 0 beginnen und auch in die anderen beiden schleifen dürften immer nur bis samplecount-1 laufen.

venice2 16. Jul 2021 20:51

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Zitat:

Zitat von brechi (Beitrag 1492448)
Die Frage ist, ob die die Range-Prüfung ausgelöst wird. Wenn FLOAT_INV.. vorher kommt, liegt es zumindest nicht daran, dass du auf einen ungültigen Speicherbereich zugreift.
Wenn du auf Speicherbereich nach dem Array zugreift würdest, dann kann dadurch schon der Fehler FLOAT_INV ausgelöst werden, je nachdem was dort steht.
Da wie bereits erwähnt ein array of single bei 0 startet müsste auch sample bei 0 beginnen und auch in die anderen beiden schleifen dürften immer nur bis samplecount-1 laufen.

Ich sagte schon
Zitat:

FLOAT_INVALID_OPERATION kommt trotzdem auch mit deinem rangecheck
Also danach.
Und nein diese werden nicht ausgelöst.

Aber ein versuch war es wert.

Habe es deaktiviert und werde die Daten Faden ohne die Wave Daten zu glätten.
Die Funktion habe ich vor 20 Jahren von Klaus Langbein aus dem VB-Forum bekommen der ist aber leider verstorben.
Na ja wie dem auch sei.

Am ende ein Programm das ich alleine verwende daher nicht so wichtig.
Danke für euer Interesse.

venice2 19. Jul 2021 14:53

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Falls mir doch noch jemand bei dem Problem helfen möchte hier ist der Quelltext.
Quelltext entfernt. Bei bedarf lade ich ihn nochmal hoch.

In uBass
Delphi-Quellcode:
procedure TBassPlayer.DrawData(PaintDC: HDC);

müssen diese Zeilen wieder aktiviert werden.

// TIA: array[1..512] of single;
// XFFT(TRA, TIA, -1, 1, 511);

und anschließend so ändern.
Delphi-Quellcode:
TIA: array[1..256] of single;
XFFT(TRA, TIA, -1, 1, 255);
die anderen bitte kommentiert lassen (ist nur ein Test)

DragDrop einen Ordner mit *.mp3 Dateien.
Wenn ein Titel gefällt diesen zu Favoriten addieren erst danach wird eine m3u erstellt mit den Lieblings Titeln.
Beim nächsten Start wird die m3u automatisch geöffnet.

Unter Plugins Settings muß "Use WaveFade" eingeschaltet sein um die Glättung der Wave Daten zu testen.
Mindest Voraussetzung Windows 10

Fritzew 19. Jul 2021 19:42

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
Hallo Emil,

habe mir Dein Projekt angeschaut.

Zuerst : Deine Grafik ist echt gut. (Optik)

Dann habe ich mir die
procedure TBassPlayer.XFFT angeschaut.
Sehe da mehrere Probleme
1. Du willst ja was zurück , dann solltest Du zumindest die 2 Arrays als Var deklarieren.
aktuell schiebst Du die nur über den Stack in die procedure, da kommt niemals was zurück.
Also so:

Delphi-Quellcode:
procedure TBassPlayer.XFFT(var FR, FI: array of single; Sign, Sample, SampleCount: Integer);
Innerhalb der procedure fehlt eine Abbruch-Bedingung in

Delphi-Quellcode:
         M := ((SampleCount) div 2);
      while M < J do
      begin
        J := J - M;
        M := M div 2;
        // Nachtragen
        if M=0 then break; // Hier steckst Du in einer endlosSchleife
      end;
Und leere Exceptblöcke sind böse. So eine methode sollte keine Exceptions werfen,
und wenn Doch willst Du das wissen :-)


Und deine FloatingPoint Probleme:

Delphi-Quellcode:
procedure TBassPlayer.DrawData(PaintDC: HDC);
var
  k: integer;
  TRA: array[1..256] of single;
  TIA: array[1..256] of single;
begin

  // Render alle Bilder in den temporären Buffer TempBufferDC
   for k := 0 to 255 do
    TRA[k + 1] := WaveData[k] / 1.50;
// Das Array TIA liegt auf dem Stack da ist zu 100% Müll drin
// Also:

  fillchar(TIA, sizeof(TIA), #0);


  XFFT(TRA, TIA, -1, 1, 255);
//
Mit diesen Änderungen läuft es bei mir durch ohne Probleme

Gruss Fritz

venice2 19. Jul 2021 19:53

AW: FLOAT_INVALID_OPERATION und FLOAT_OVERFLOW nur 64Bit
 
@FritzW erstmal Danke das du dir das angeschaut hast.
Manchmal ist es schwer ohne den Quelltext zu zeigen etwas vernünftig erklären zu wollen.
Hatte schon befürchtet das es niemanden interessiert. :wink:

Zitat:

Zuerst : Deine Grafik ist echt gut. (Optik)
Danke!

Zitat:

1. Du willst ja was zurück , dann solltest Du zumindest die 2 Arrays als Var deklarieren.
aktuell schiebst Du die nur über den Stack in die procedure, da kommt niemals was zurück.
Also so:
Jep! Das ist sehr schlecht ist mir ehrlich gesagt gar nicht aufgefallen.
Werde es beheben.

Zitat:

Und leere Exceptblöcke sind böse. So eine methode sollte keine Exceptions werfen,
und wenn Doch willst Du das wissen
Gebe ich dir recht.
Wollte nur mal grundsätzlich rausspringen können wenn was fehl schlägt. Aber bringt beim debuggen von Float exeptions eh nichts.

Zitat:

Mit diesen Änderungen läuft es bei mir durch ohne Probleme
Werde deine Einstellungen übernehmen und anschließend eine Meldung abgeben wie es hier läuft.
Nochmals Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 Uhr.
Seite 2 von 3     12 3      

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