![]() |
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; |
Re: Summe bilden
Die Fehlermeldung sagt doch schon alles: Deine Fließkommazahlen überschreiten den Wertebereich deines Datentyps.
|
Re: Summe bilden
@Luckie
Danke für die schnelle Antwort. Und wie löse ich die Fehlermeldung? Bin Anfänger :oops: |
Re: Summe bilden
Zitat:
|
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. |
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 |
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 |
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