Probleme mit Datentyp double

Gast #3105094
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
:)
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.