Probleme mit Datentyp double

Gast #3105094
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
Gast #3105130
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
#3105321
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.
#3105341
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.
#3105365
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren