Komisches Verhalten in der Matrix



  • Der Rest sollte unter Rundungsfehler laufen.

    Die Genauigkeit von Fließkommazahlen ist begrenzt.

    Im Dezimalsystem kennst du sicher das Problem mit mit 1/3 (0,3333333333333) oder 1/9 (0,11111111)
    Im Binärsystem ist 0,2 auch so eine Zahl

    Hinauszögern kannst du das Problem, indem du double statt float nimmst
    Umgehen kannst du das, indem in der for-Schleife das x (als Ganzzahl) zählst und daraus die Werte berechnest.



  • Ich hab das jetzt kurz mit double getestet, bringt leider nicht viel bis gar nix. Selbst mit long double ist keine veränderung sichtbar (ja ich habe auch alles in %lf geändert).

    Jetzt muss ich nochmal nachfragen, wie genau ist das mit dem x gemeint? :S



  • Und nochmal zum logischen UND.

    Da gilt die Kurzschlußregel. Wenn das erste Argumet schon zur Bestimmung des Ergebnis reicht, wird das zweite Argument nicht mehr ausgewertet.

    Bei dir ist Counter 0. Und 0 && irgendwas bleibt 0.
    Im zweiten Durchlauf sieht das dann schon anders aus.

    Es würde hier funktioniern, wenn du Preincrement nimmst ++Counter&&x++ .
    Aber richtiger und besser lesbar wird es dadurch auch nicht.

    Btw: Es gibt keine guten (deutschen) Online-Tutorials für C.



  • for(x=0; x<20; x++, Counter++)
        {
            Unterteilungsstellen = x / (double)20 *  4.0;  // 20  Werte im Array und  20 * 0.2 = 4.0
    
            Wertetabelle[x][y]=Unterteilungsstellen;
            printf("Unterteilungsstellen: %.2f\n",Unterteilungsstellen);
            printf("         Counter: %d\n",Counter);
            printf("     Werteintrag: %.2f\n\n",Wertetabelle[x][y]);
        }
    


  • Es werden aber nicht zwingend alle Werte im Array vollgeschrieben, daher verstehe ich die 20*4.0 nicht...



  • -Hier standen Unwahrheiten-



  • roflo schrieb:

    Mit

    int m[20][2]
    

    deklarierst du ein Array mit der Größe 2, welches wiederum Arrays mit der Größe 20 enthält.

    Nein, m ist ein Array von 20 Arrays à zwei int s.
    m[y] bezeichnet entsprechend das y te Zweierarray, usw...



  • 😮 Habs grad getestet. Mein Leben beruht auf einer Lüge 🙂



  • Caligulaminus schrieb:

    m[y] bezeichnet entsprechend das y te Zweierarray, usw...

    richtig ist
    das (y-1) te Zweierarray
    wenn y sich auf die Größe des Arrays bezieht.



  • 🙄



  • 😮 Habs grad getestet. Mein Leben beruht auf einer Lüge 🙂

    Kenn ich, ist mir gestern auch aufgefallen mit dem logischen && 😢



  • Mir gings nicht um &&.



  • Is mir schon klar....?



  • Naja wie auch immer 😉
    Was war denn jetzt genau dein Problem?



  • Was war denn jetzt genau dein Problem?

    Jetzt nur noch das Schreiben des letztes Wertes in der Wertetabelle, denn

    Es werden aber nicht zwingend alle Werte im Array vollgeschrieben, daher verstehe ich die 20*4.0 nicht...

    x/20*4.0 ergibt halt etwas völlig anderes als ich da hineingeschrieben haben möchte



  • TocToc schrieb:

    x/20*4.0 ergibt halt etwas völlig anderes als ich da hineingeschrieben haben möchte

    Sorry, wenn das nicht deinen Werten entspricht.

    Zunächst: So habe ich das nicht geschrieben.

    Wenn du einen anderen Wertebereich haben möchtest, musst du die Werte anpassen.
    Ich bin von 20 Werten mit 0.2 Breite ausgegangen. (20 * 0. 2 ist 4.0)
    Wenn du nur 10 Werte haben möchtest, dann ändere die Schleife auf <= 10
    (Das ändert dann aber nichts an dem 20*4.0)



  • Okay, verstanden, aber mir ist gerade eine andere Idee gekommen:
    Ich runde den Wert für die Streifenbreite schon der for-Schleife auf vier Nachkommastellen ab (das war ja nur nen Auzug, die eigentliche Rechnung war ja anders 😉 ).

    Wie genau muss ich das nochmal machen...? lround() oder *1000 0.5...so genau weiß ich das nicht mehr...hat jmd nen Link für mich? Das Thema gabs doch schon mal hier oder? 😕


Anmelden zum Antworten