Hallo,
ich habe ein kleines Problem mit dem Datentyp double, bzw ein Feld von
double.
Im Konstruktor weise ich meinem Feld Daten in ca. diesem Bereich zu:
-0.0000071542215224, -0.0000072743444833, -0.0000054250607117
Das sind meine Koeffizienten für eine anschließende Filterung.
Nun möchte ich dieses Filter testen. Dies geschieht mithilfe eines
Sinus, der von 1 bis -1 geht.
Teste ich nun das Filter, bekomme ich jedoch einen Wert von bis zu 100 *
10^9 heraus.
Wie ist das möglich? Meine Koeffizienten sind sehr klein ( unter 1 ) und
auch der Sinus erreicht nie einen Wert über 1...
Bitte um Hilfe
mfg
:)
Ja klar. Ich poste einfach mal alle für dieses Problem relevanten
Code-Abschnitte:
Für die Filterung habe ich 2 Double - Felder mit der Größe von 211:
Hier im Kontrukter schreibe ich meine Koeffizienten Werte( alle kleiner
als 1)
In meiner Berechnung erstelle ich einen Sinus, mit max Amplitude von 1
und rufe meine Filterung auf:
Danach komm ich zur Filterung, wo ich erst Initialisiere( Ringbuffer
befülle) und danach die Filterung durchführe. Wobei meine restlichen
Variablen alle Global sind. Sie werden jedoch nur hier verwendet.
Das Problem: Durch die Filterung sollte eig der Maximalwert, der
erreicht wird nicht über die Amplitude des Sinus gehen, jedoch bekomme
ich einen Sinus zwischen 100*10^9 und -100*10^9 und kann mir nicht
erklären warum....
mfg
Anti-Programmierer schrieb:> Für die Filterung habe ich 2 Double - Felder mit der Größe von 211:
Humf.
Du verzeihst mir, dass ich die jetzt nicht durchsehe, ob du irgendwo
einen Tippfehler in den Exponenten hast.
Wenn du sie wenigstens schön in Tabellenform hättest, so dass der
Exponent immer sauber untereinander steht.
Wo kommen die Werte her?
Händisch eingetippt, oder per Programm generiert?
Wie hoch ist die Wahrscheinlichkeit auf einen Tippfehler?
> yf = 0;>> for (int i = 0; i < 211; i++)> {> yf += Koeffizienten[i] * Ringbuffery[((i + index) %> 211)];> }> this.Text = yf.ToString();> erreicht wird nicht über die Amplitude des Sinus gehen, jedoch bekomme> ich einen Sinus zwischen 100*10^9 und -100*10^9 und kann mir nicht> erklären warum....
Na, dann lass dir halt mal die Zwischenwerte mit ausgeben.
Ist ja kein Verbrechen, wenn dein Programm während der Debug-Phase
zwischendurch mal mehr Output generiert
> for (int i = 0; i < 211; i++)> {> yf += Koeffizienten[i] * Ringbuffery[((i + index) %> 211)];
this.Text += i.toString + " " + yf.ToSting() + "\r\n";
> }
Und dann studierst du mal den Output wie sich die Sache entwickelt.
(Wenn this.Text nicht geht, dann eben irgend ein anderes Anzeigeelement,
auf welches du problemlos 500 Zeilen ausgeben kannst.
Anti-Programmierer schrieb:> tja, das is es wohl....> Jez fehlt mir ein Koeffizient :/ son Mist, aber danke...> Schon 100.000 mal durchgesehen und immer überlesen
Ein Tip.
Man soll es nicht für möglich halten, welche Wunder bei solchen Sachen
eine saubere Tabellenformatierung bewirken kann.
Das liegt wohl daran, dass unser Gehirn seit Urzeiten darauf trainiert
ist, Muster zu erkennen bzw. noch viel mehr darauf konditioniert ist
Fehler in einem regelmässigen Muster zu erkennen.
Ich hab 2 falsche Exponentenbuschstaben eingebaut und einen Punkt-Komma
Fehler. Siehst du sie?
Das zu kontrollieren dauert jetzt keine 20 Sekunden mehr.
Karl Heinz Buchegger schrieb:> Anti-Programmierer schrieb:>> tja, das is es wohl....>> Jez fehlt mir ein Koeffizient :/ son Mist, aber danke...>> Schon 100.000 mal durchgesehen und immer überlesen>> Ein Tip.> Man soll es nicht für möglich halten, welche Wunder bei solchen Sachen> eine saubere Tabellenformatierung bewirken kann.
Anderer Tipp bzw. das erste was ich auf einem neu eingerichteten/neu zu
benutzenden System mache: Das Zahlenformat systemweit und in den
üblichen Tools mit denen sowas generiert wird (Excel etc.) auf etwas
programmiersprachen-kompatibles einstellen...