AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Summe bilden

Ein Thema von mitchel · begonnen am 8. Aug 2007 · letzter Beitrag vom 8. Aug 2007
Antwort Antwort
mitchel

Registriert seit: 30. Jul 2007
12 Beiträge
 
#1

Summe bilden

  Alt 8. Aug 2007, 09:34
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Summe bilden

  Alt 8. Aug 2007, 09:37
Die Fehlermeldung sagt doch schon alles: Deine Fließkommazahlen überschreiten den Wertebereich deines Datentyps.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
mitchel

Registriert seit: 30. Jul 2007
12 Beiträge
 
#3

Re: Summe bilden

  Alt 8. Aug 2007, 09:40
@Luckie
Danke für die schnelle Antwort.
Und wie löse ich die Fehlermeldung? Bin Anfänger
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Summe bilden

  Alt 8. Aug 2007, 09:45
Zitat von mitchel:
Und wie löse ich die Fehlermeldung? Bin Anfänger
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
HLukas

Registriert seit: 27. Nov 2006
Ort: Frickenhausen
14 Beiträge
 
Delphi 6 Professional
 
#5

Re: Summe bilden

  Alt 8. Aug 2007, 10:23
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.
  Mit Zitat antworten Zitat
PMM

Registriert seit: 17. Feb 2005
101 Beiträge
 
#6

Re: Summe bilden

  Alt 8. Aug 2007, 10:28
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Summe bilden

  Alt 8. Aug 2007, 11:25
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
  Mit Zitat antworten Zitat
mitchel

Registriert seit: 30. Jul 2007
12 Beiträge
 
#8

Re: Summe bilden

  Alt 8. Aug 2007, 12:17
DATAFFTai0 und DATAFFTai1 sind global definiert....
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:03 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