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
In Zeile 42 ist die Klammer falsch gesetzt, die muss vor das Semikolon.
Wenn Du uns an Deinem Code partizipieren lässt, kann Dir evtl. auch jemand helfen. Grüsse, R.
@Anti-Programmierer Soweit ich sehen kann ist Dein Code fehlerfrei. Das liegt bestimmt am Wetter.
:) 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:
1 | Koeffizienten = new double[211] |
2 | {
|
3 | -7.1542215224E-6, -7.2743444833E-6, -5.4250607117E-6, -0.0000011100975763E-0, 0.0000057973299053E-0, 0.000014912211580E-0, |
4 | 0.000025259127684E-0, 0.000035287917709E-0, 0.000043003281959E-0, 0.000046211227835E-0, 0.000042864663922E-0, 0.000031468905641E-0, |
5 | 0.000011488996397E-0, -0.000016311667291E-0, -0.000049674590836E-0, -0.000084855229475E-0, -0.00011687996942E-0, -0.00014006034620E-0, -0.00014873340791E-0, |
6 | -0.00013815449190E-0, -0.00010543033939E-0, -0.000050353315957E-0, 0.000024012278181E-0, 0.00011112883919E-0, 0.00020127067375E-0, |
7 | 0.00028234041721E-0, 0.00034118803532E-0, 0.00036532304603E-0, 0.00034483350975E-0, 0.00027426413137E-0, 0.00015417207570E-0, -0.0000079180833200E-0, |
8 | -0.00019739457224E-0, -0.00039342290231E-0, -0.00057082437573E-0, -0.00070285743599E-0, -0.00076464566986E-0, -0.00073686753921E-0, |
9 | -0.00060923114426E-0, -0.00038322051169E-0, -0.000073630494093E-0, 0.00029149024621E-0, 0.00067269975507E-0, 0.0010228181708E-0, 0.0012921221542E-0, |
10 | 0.0014345793860E-0, 0.0014144191001E-0, 0.0012122004471E-0, 0.00082950393083E-0, 0.00029144863009E-0, -0.0003536797445E-0, -0.0010372129635E-0, |
11 | -0.0016775761045E-0, -0.0021880689237E-0, -0.0024880009867E-0, -0.0025136508583E-0, -0.002284509828E-0, -0.00075869422153E-0, 0.00031118123246E-0, |
12 | 0.0014680296788E-0, 0.0025774117249E-0, 0.0034954410830E-0, 0.0040858121491E-0, 0.0042377358916E-0, 0.0038826218098E-0, 0.0030072813690E-0, |
13 | 0.0016616400391E-0, -0.000040570468504E-0, -0.0019289468255E-0, -0.00379142931502E-0, -0.0053952000273E-0, -0.0065143569680E-0, -0.0069568666261E-0, |
14 | -0.0065923277367E-0, -0.0053742992481E-0, -0.0033549976160E-0, -0.00068971562366E-0, 0.0023705604692E-0, 0.0054986085974E-0, 0.0083213930104E-0, |
15 | 0.010458976401E-0, 0.011568263969E-0, 0.011384068442E-0, 0.0097735841179E-0, 0.0067364851257E-0, 0.0024515376144E-0, -0.0027382048289E-0, |
16 | -0.0083399715821E-0, -0.013746130678E-0, -0.018283962101E-0, -0.021276242528E-0, -0.022107144797E-0, -0.020287081876E-0, -0.015509887560E-0, -0.0076961773847E-0, |
17 | 0.0029821475865E-0, 0.016099599779E-0, 0.030998249353E-0, 0.046831252195E-0, 0.062625433958E-0, 0.077357614247E-0, 0.090037860543E-0, 0.099792027388E-0, |
18 | 0.10593586153E-0, 0.10803365697E-0, 0.10593586153E-0, 0.099792027388E-0, 0.090037860543E-0, 0.077357614247E-0, 0.062625433958E-0, 0.046831252195E-0, 0.030998249353E-0, |
19 | 0.016099599779E-0, 0.0029821475865E-0, -0.0076961773847E-0, -0.015509887560E-0, -0.020287081876E-0, -0.022107144797E-0, -0.021276242528E-0, -0.018283962101E-0, |
20 | -0.013746130678E-0, -0.0083399715821E-0, -0.0027382048289E-0, 0.0024515376144E-0, 0.0067364851257E-0, 0.0097735841179E-0, 0.011387068442E-0, 0.011568263969E-0, |
21 | 0.010458976401E-0, 0.0083213930104E-0, 0.0054986085974E-0, 0.0023705604692E-0, -0.00068971562366E-0, -0.0033549976160E-0, -0.0053742992481E-0, -0.0065923277367E-0, |
22 | -0.0069568666261E-0, -0.0065143569680E-0, -0.0053952000273E-0, -0.0037912931502E-0, -0.0019289468255E-0, -0.000040570468504E-0, 0.0016616400391E-0, 0.0030072813690E-0, |
23 | 0.0038826218098E-0, 0.0042377358916E-0, 0.0040858121491E-0, 0.0034954410830E-0, 0.0025774117249E-0, 0.0014680296788E-0, 0.00031118123246E-0, -0,00075869422153E-0, -0.0016308669653E-0, |
24 | -0.0022284509828E-0, -0.0025136508583E-0, -0.0024880009867E-0, -0.0021880689237E-0, -0.0016775761045E-0, -0.0010372129635E-0, -0.00035356797445E-0, 0.00029144863009E-0, 0.00082950393083E-0, |
25 | 0.0012122004471E-0, 0.0014144191001E-0, 0.0014345793860E-0, 0.0012921221542E-0, 0.0010228181708E-0, 0.00067269975507E-0, 0.00029149024621E-0, -0.000073630494093E-0, -0.00038322051169E-0, |
26 | -0.00060923114426E-0, -0.00073686753921E-0, -0.00076464566986E-0, -0.00070285743599E-0, -0.00057082437573E-0, -0.00039342290231E-0, -0.00019739457224E-0, -0.0000079180833200E-0, |
27 | 0.00015417207570E-0, 0.00027426413137E-0, 0.00034483350975E-0, 0.00036532304603E-0, 0.00034118803532E-0, 0.00028234041721E-0, 0.00020127067375E-0, 0.00011112883919E-0, 0.000024012278181E-0, |
28 | -0.000050353315957E-0, -0.00010543033939E-0, -0.00013815449190E-0, -0.00014873340791E-0, -0.00014006034620E-0, -0.00011687996942E-0, -0.000084855229475E-0, -0.000049674590836E-0, |
29 | -0.000016311667291E-0, 0.000011488996397E-0, 0.000031468905641E-0, 0.000042864663922E-0, 0.000046211227835E-0, 0.000043003281959E-0, 0.000035287917709E-0, 0.000025259127684E-0, |
30 | 0.000014912211580E-0, 0.0000057973299053E-0, -0.0000011100975763E-0, -0.0000054250607117E-0, -0.0000072743444833E-0, -0.0000071542215224E-0 |
31 | |
32 | };
|
33 | Ringbuffery = new double[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:
1 | double time = (Environment.TickCount - tickStart) / 1000.0; |
2 | y = Math.Sin(2.0 * Math.PI * 0.2 * time); |
3 | Filterung(); |
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.
1 | Ringbuffery[index] = y; |
2 | |
3 | index++; |
4 | |
5 | if (index >= 211) |
6 | {
|
7 | init = true; |
8 | index = 0; |
9 | }
|
10 | |
11 | // this.Text = index.ToString();
|
12 | |
13 | if (!init) |
14 | {
|
15 | return; |
16 | }
|
17 | |
18 | yf = 0; |
19 | |
20 | for (int i = 0; i < 211; i++) |
21 | {
|
22 | yf += Koeffizienten[i] * Ringbuffery[((i + index) % 211)]; |
23 | }
|
24 | this.Text = yf.ToString(); |
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.
tja, das is es wohl.... Jez fehlt mir ein Koeffizient :/ son Mist, aber danke... Schon 100.000 mal durchgesehen und immer überlesen
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.
1 | Koeffizienten = new double[211] |
2 | { |
3 | -7.154221522400000E-6, -7.274344483300000E-6, -5.425060711700000E-6, -0.0000011100975763E-0, 0.0000057973299053E-0, |
4 | 0.000014912211580E-0, 0.000025259127684E-0, 0.000035287917709E-0, 0.0000430032819590E-0, 0.0000462112278350R-0, |
5 | 0.000042864663922E-0, 0.000031468905641E-0, 0.000011488996397E-0, 0.0000163116672910E-0, -0.0000496745908360E-0, |
6 | -0.000084855229475E-0, -0.000116879969420E-0, -0.000140060346200E-0, -0.0001487334079100E-0, -0.0001381544919000E-0, |
7 | -0.000105430339390E-0, -0.000050353315957E-0, 0.000024012278181E-0, 0.0001111288391900K-0, 0.0002012706737500E-0, |
8 | 0.000282340417210E-0, 0.000341188035320E-0, 0,000365323046030E-0, 0.0003448335097500E-0, 0.0002742641313700E-0, |
9 | 0.000154172075700E-0, -0.000007918083320E-0, -0.000197394572240E-0, -0.0003934229023100E-0, -0.0005708243757300E-0, |
10 | -0.000702857435990E-0, -0.000764645669860E-0, -0.000736867539210E-0, |
11 | ... |
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...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.