Forum: PC-Programmierung Probleme mit Datentyp double


von Anti-Programmierer (Gast)


Lesenswert?

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

von Roland (Gast)


Lesenswert?

In Zeile 42 ist die Klammer falsch gesetzt, die muss vor das Semikolon.

von Rene H. (Gast)


Lesenswert?

Wenn Du uns an Deinem Code partizipieren lässt, kann Dir evtl. auch 
jemand helfen.

Grüsse,
R.

von Rando (Gast)


Lesenswert?

"Anti-Programmierer" - Guter Nick :)

von amateur (Gast)


Lesenswert?

@Anti-Programmierer
Soweit ich sehen kann ist Dein Code fehlerfrei.
Das liegt bestimmt am Wetter.

von Anti-Programmierer (Gast)


Lesenswert?

:)
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

von Arc N. (arc)


Lesenswert?

Was liefert Koeffizienten.Max() (bzw. achte Zeile von unten...)?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Anti-Programmierer (Gast)


Lesenswert?

tja, das is es wohl....
Jez fehlt mir ein Koeffizient :/ son Mist, aber danke...
Schon 100.000 mal durchgesehen und immer überlesen

von Karl H. (kbuchegg)


Lesenswert?

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.

von Arc N. (arc)


Lesenswert?

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
Noch kein Account? Hier anmelden.