Probleme mit double



  • Danke für die schnelle Antwort.
    Nein, ich habe in jedem Fall 0.2 eingegeben, habe es mehrmals kontrolliert.



  • Geht's so?

    #include <stdio.h>
    
    void cb(void)
    {
        int c;
        while ((c = getchar()) != EOF && c != '\n')
            ;
    }
    
    main() {
        double summe=0.0,zahl;
        printf("\n1.Zahl: ");
        scanf("%lf",&zahl); cb();
        summe=summe+zahl;
        printf("2. Zahl: ");
        scanf("%lf",&zahl); cb();
        summe=summe+zahl;
        printf("3. Zahl: ");
        scanf("%lf",&zahl); cb();
        summe=summe+zahl;
        printf("\nEndergebnis: %.17lf\n",summe);
    }
    

    Könnte einen Versuch wert sein.



  • ~/test

    1.Zahl: 0.2
    2. Zahl: 2
    3. Zahl: 2

    Endergebnis: 4.20000000000000018

    Funktioniert tatsächlich, allerdings bringt es mich nicht wirklich weiter, da ich davon nichts verstehe, da ich ja noch am Anfang des Buchs bin und ehrlich gesagt nicht verstehe, was am obigen Code falsch sein soll.. hmm.. dennoch vielen Dank, vielleicht lässt sich obiger Sachverhalt auch noch klären - interessant wäre es auch zu wissen, weshalb ich in der letzten Zeile bei der Ausgabe des Endergebnisses als Platzhalter %f und nicht %lf verwende.

    lg



  • NP1 schrieb:

    Das Kompilieren funktioniert problemlos und der Compiler (GCC @ Linux) gibt keine Warnungen oder Hinweise aus.

    Ruf ihn auf mit gcc -std=c99 -Wall -Wextra -pedantic (oder so), dann löst sich auch dieses Problem.

    NP1 schrieb:

    allerdings bringt es mich nicht wirklich weiter, da ich davon nichts verstehe, da ich ja noch am Anfang des Buchs bin und ehrlich gesagt nicht verstehe, was am obigen Code falsch sein soll

    Das ist so: Bei der Eingabe der ersten Zahl kommt wahrscheinlich nach der Zahl als nächstes Zeichen ein Zeilenumbruch. Der liegt noch im Eingabepuffer, wenn der zweite scanf()-Aufruf erfolgt. Dort steht im Formatstring %lf, d.h. scanf() erwartet eine Reihe von Zeichen, die ein double darstellen. Wenn eine unpassende Eingabe erfolgt, signalisiert das scanf() über den Rückgabewert, den du aber ignorierst. Also weicht der Verlauf des Programms von deinen Voraussetzungen ab, und es passieren seltsame Dinge. In dieser Hinsicht ist dein Buch also Mist, wenn es dir das nicht erklärt hat. cb() tut nichts anderes, als solange einzelne Zeichen einzulesen und zu ignorieren, bis das eingelesene Zeichen ein Zeilenumbruch war (oder gar keine Zeichen mehr kommen).

    Den zweiten Absatz hätte ich mir übrigens sparen können, wenn du den ersten schon gekannt hättest, denn dann hätte der gcc gewarnt:

    Warnung: Der Rückgabewert von »scanf«, der mit dem Attribut warn_unused_result deklariert wurde, wird ignoriert
    

    🙂



  • NP1 schrieb:

    interessant wäre es auch zu wissen, weshalb ich in der letzten Zeile bei der Ausgabe des Endergebnisses als Platzhalter %f und nicht %lf verwende.

    Weil float's manchmal recht flüchtig sind, da sie in manchen Fällen zu double's konvertiert werden. Bei printf() ist das so, deshalb steht bei printf() das %f nicht für float, sondern für double.



  • Danke für die ausführliche Erklärung - habe es im Groben und Ganzen in etwa verstanden, dumm nur, dass mein Buch dieses Beispiel bringt, das dann nicht funktioniert und darauf auch nicht weiter eingeht (im Buch geht der Autor davon aus, dass es funktioniert - ich hoffe, dass nicht weitere solche Fälle vorkommen).



  • NP1 schrieb:

    Danke für die ausführliche Erklärung - habe es im Groben und Ganzen in etwa verstanden,

    So war's geplant.

    NP1 schrieb:

    dumm nur, dass mein Buch dieses Beispiel bringt, das dann nicht funktioniert und darauf auch nicht weiter eingeht (im Buch geht der Autor davon aus, dass es funktioniert - ich hoffe, dass nicht weitere solche Fälle vorkommen).

    Mach dir nichts draus, keiner kennt ein problemloses deutschsprachiges C-Buch (will denn niemand eines schreiben?). C kann bisweilen ein bisschen bockig sein. Wenn du nicht weiter weisst, frag irgendwo im Internet nach. Ohne das Internet wäre das ganze Internet sowieso schon längst zusammengebrochen.

    Übrigens hab ich den Code von cb() aus den FAQ geklaut:
    http://www.c-plusplus.net/forum/39349

    Dort ist er allerdings gut versteckt, und man kann getrost annehmen, dass ihn an deiner Stelle dort keiner gefunden hätte.


  • Mod

    Das Programm ist nicht falsch. scanf sollte bei numerischen Eingaben Wwitespaces ignorieren. Auch deutet das Ergebnis der Summe (0) bei Eingabe 0.2 darauf hin, dass nur die 0 oder gar nichts eingelesen wurde. Hier geht noch irgendetwas anderes vor.



  • mngbd schrieb:

    Ohne das Internet wäre das ganze Internet sowieso schon längst zusammengebrochen.

    🤡



  • SeppJ schrieb:

    Das Programm ist nicht falsch. scanf sollte bei numerischen Eingaben Wwitespaces ignorieren. Auch deutet das Ergebnis der Summe (0) bei Eingabe 0.2 darauf hin, dass nur die 0 oder gar nichts eingelesen wurde. Hier geht noch irgendetwas anderes vor.

    Das stimmt. Aber ich hab keine Ahnung was, weil ich das nicht reproduzieren kann. Ich hatte das aber schon öfter auf GNU-Systemen, und nachdem der cb-Trick aushilft, hab ich nie weiter drüber nachgedacht.



  • Ich wollte nur kurz Bescheid geben, dass das Problem offensichtlich behoben wurde. Der Code, der im ersten Beitrag gepostet wurde, funktioniert nun einwandfrei.

    (Aktuell nutze ich gcc 4.6.0-3)


Anmelden zum Antworten