Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Summe bilden (https://www.delphipraxis.net/97300-summe-bilden.html)

mitchel 8. Aug 2007 09:34


Summe bilden
 
Hallo zusammen,
ich habe folgendes Problem:
Es werden 2 Messsignale aufgezeichnet und ausgewertet. Unter anderem findet eine FFT statt. Diese funktioniert auch. Nun will ich eine Berechnung machen, bei der ich die Genauigkeit der Übertragungsfunktion bis 20Hz prüfe.
Hierfür habe ich ein neues Array (GenauF) definiert. In Abhängigkeit von i hat es unterschiedlich viele Werte. So weit so gut, doch leider kommt bei der Berechnung immer die Fehlermeldung "Im Project ist eine Exception der Klasse EOverflow aufgetreten. Meldung 'Gleitkommaüberlauf'".
Kann mir jemand weiterhelfen?

Außerdem möchte ich gerne die GenauF[i] miteinander summieren. Gibt es dafür einen speziellen Befehl?

Vielen Dank im voraus...


Delphi-Quellcode:
var
  DATAFFTai0,      //Wert erste Kurve
  DATAFFTai1,      //Wert zweite Kurve
  GenauF: array[0..32768] of double;
  i: Integer;
  fl: double;
  fn: double;
  NormValue: string;

begin
  fl := UmrFaktorFFT;
  UmrFaktorFFT := tA/Zoombereich;
  fn := 19.531;
  i := 1;

  while (i * UmrFaktorFFT < 20) do        //Prüfung nur bis 20Hz
    begin
      GenauF[i] := (1-(1/(fn - fl))*fl*abs(1-(DATAFFTai0[i+1]/DATAFFTai1[i+1])))*100;
      //DATAFFTai[i+1] da DATAFFTai[1]=0 wegen Offset
      inc(i,1);
    end;
  //NormValue = Summe der GenauF[i] in Abbhängigkeit von i*UmrFaktor < 20

  if UmrFaktorFFT > 20   then
    begin
      showmessage('Zoombreich zu klein gewählt!' +#13+
                  'Keine Berechnung bis 20Hz möglich!')
    end;
end;

Luckie 8. Aug 2007 09:37

Re: Summe bilden
 
Die Fehlermeldung sagt doch schon alles: Deine Fließkommazahlen überschreiten den Wertebereich deines Datentyps.

mitchel 8. Aug 2007 09:40

Re: Summe bilden
 
@Luckie
Danke für die schnelle Antwort.
Und wie löse ich die Fehlermeldung? Bin Anfänger :oops:

Luckie 8. Aug 2007 09:45

Re: Summe bilden
 
Zitat:

Zitat von mitchel
Und wie löse ich die Fehlermeldung? Bin Anfänger :oops:

Nachdenken: Entweder du nimmst einen Datentyp, der groß genug für die zu erwartenden Zahlen ist oder du sorgst dafür, dass die Zahlen nicht größer werden als der Wertebereich deines Datentyps.

HLukas 8. Aug 2007 10:23

Re: Summe bilden
 
Die variablen
DATAFFTai0, //Wert erste Kurve
DATAFFTai1, //Wert zweite Kurve
erhalten keinen Wert, sind damit zufällig und damit kann kein sinnvolles Ergebnis
zustande kommen.
Ausserdem ist eine Stringvariable zur Summenbildung natürlich ungeeignet.

PMM 8. Aug 2007 10:28

Re: Summe bilden
 
In Ergänzung zu dem was Luckie angemerkt hat:
- Gemischte Berechnungen mit Integer / Real Zahlen zwingen den Compiler zu Typenumwandlungen für Zwischenergebnisse. Nicht immer errät er dabei den richtigen Datentyp.
- Konstanten (hier z.B.) 1 werden u.U. als Integer erkannt, wenn keine Nachkommastellen auftauchen. Manchmal ist es deshalb besser 1.0 zu schreiben, um implizite Typenumwandlungen zu vermeiden.
- Bei Floatingpoint Berechnungen kommt es nach meiner Erfahrung vor, dass der Fehler "verspätet" gemeldet wird. Also nicht an der auslösenden Stelle, sondern später, wenn man versucht mit einem "kapputen" z.B. NaN-Wert weiter zu rechnen.
Viel Spass beim Debuggen,
PMM

marabu 8. Aug 2007 11:25

Re: Summe bilden
 
Hallo,

ich nehme mal an, dass die gezeigten Variablen global deklariert sind und die notwendigen Werte an anderer Stelle zugewiesen werden, bevor der Code-Block ausgeführt wird. Trotzdem noch ein paar Anmerkungen:

(1) Berechnungen sollten in einer Funktion gekapselt werden, benötigte Variablen sollten als Ein- und Ausgabe-Parameter zur Verfügung gestellt werden. Auf diese Weise kann eine Funktion mehrfach genutzt und einzeln ausgetestet werden.

(2) Interaktionen (ShowMessage) aus einer solchen Berechnung heraus sollten unterbleiben, besser einen Rückgabewert oder Fehlercode vorsehen. Auch das erhöht die Wiederverwendbarkeit (GUI und Batch).

(3) Dynamische Speicheranforderungen sind mitunter wirtschaftlicher. Im vorliegenden Fall wäre das Array GenauF[] ein Kandidat für die vorkalkulierte dynamische Anforderung - oder werden immer 32K Einträge existieren?

(4) Wertebereiche planen und prüfen. Insbesonder Laufvariablen sind eine Fehlerquelle. Im vorliegenden Fall wird durch einen Fehler der Klasse "off-by-one" das erste Array-Item nicht initialisiert und kann im Verlauf der Berechnung zum beobachteten Overflow führen.

(5) Vorhandene und getestete Codes verwenden. Die Summierung über GenauF[] kann mit der Funktion Sum() aus der Unit Math erledigt werden - so vorhanden.

Grüße vom marabu

mitchel 8. Aug 2007 12:17

Re: Summe bilden
 
DATAFFTai0 und DATAFFTai1 sind global definiert....


Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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