xNeTworKx: (C) Extremnewbie braucht Hilfe beim addieren

#include <h.allo>

Ich hab so zur Übung ein Programm versucht, das 2 Kommazahlen addieren soll, so weit so gut. Wenn ich jetzt aber zB 12.4 und 45.67 eingebe, schreibt er mir hin : Die Summe von 12.400000 und 45.669998 ergibt 58.070000 . Warum ist das so ?

#include <stdio.h>

float x, y, z;
    float summe(float x, float y);

int main(void)   {

puts("Gib 2 Kommazahlen nebeneinander ein :");
    scanf("%f %f", &x, &y);

z = summe(x, y);

printf("Die Summe von %f und %f ergibt %f\n", x, y, z);

return 0;
}

float summe(float x, float y)   {
      return (x + y);
      }

  1. Hi!

    Ich hab so zur Übung ein Programm versucht, das 2 Kommazahlen addieren soll, so weit so gut. Wenn ich jetzt aber zB 12.4 und 45.67 eingebe, schreibt er mir hin : Die Summe von 12.400000 und 45.669998 ergibt 58.070000 . Warum ist das so ?

    Achja, hier hätte es nicht mal den Code gebraucht. Das ist der alte Fließkomma"fehler". Wie genau das zustande kommt, kann ich Dir jetzt nicht erklären, hängt damit zusammen, wie Fließkommazahlen intern gespeichert werden.
    Aber auf jeden Fall ist es etwas, das Du nicht verhindern kannst. Es gibt nicht viel, was Du dagegen tun kannst.

    VG Simon

    1. #include <h.allo>

      Aha verstehe, naja, dann kann man eben nichts machen, danke.

    2. Hi!

      Ich hab so zur Übung ein Programm versucht, das 2 Kommazahlen addieren soll, so weit so gut. Wenn ich jetzt aber zB 12.4 und 45.67 eingebe, schreibt er mir hin : Die Summe von 12.400000 und 45.669998 ergibt 58.070000 . Warum ist das so ?

      Achja, hier hätte es nicht mal den Code gebraucht. Das ist der alte Fließkomma"fehler". Wie genau das zustande kommt, kann ich Dir jetzt nicht erklären, hängt damit zusammen, wie Fließkommazahlen intern gespeichert werden.

      http://forum.de.selfhtml.org/?m=53076&t=9586

      Ist hier eine Verschwörung in Gange? Müssen jetzt alle plötzlich aus einem inneren Zwang heraus Kommazahlen addieren? Oder ist nur gerade Zeit für die jährliche Steuererklärung/Vereinsabrechnung/Dimensionieren des In-Diesem-Jahr-Bauen-Wir-Es-Endlich-Gartenhäuschens?

      Grüße vom Mond,
        soenk.e

      1. *ROFLMAO* =)

  2. #include <h.allo>

    Ich hab so zur Übung ein Programm versucht, das 2 Kommazahlen addieren soll, so weit so gut. Wenn ich jetzt aber zB 12.4 und 45.67 eingebe, schreibt er mir hin : Die Summe von 12.400000 und 45.669998 ergibt 58.070000 . Warum ist das so ?

    Warum das so ist kann ich dir leider nicht sagen. Tritt der Fehler auch auf, wenn du double anstelle von float benutzst?

    #include <stdio.h>

    float x, y, z;

    Ohohohoh, was ist denn das? Gehört das nicht in die main-Funktion? Oder gibt es eine neue Methode um globale Variablen in C zu deklarieren, von der ich nichts mitbekommen hab?

    float summe(float x, float y);

    int main(void)   {

    Hier gehört nun die deklaration hin:
           float x, y, z;

    puts("Gib 2 Kommazahlen nebeneinander ein :");
        scanf("%f %f", &x, &y);

    z = summe(x, y);

    printf("Die Summe von %f und %f ergibt %f\n", x, y, z);

    schreib mal hier
           printf("Die Summe von %f und %f ergibt %f\n",x,y,(x+y);
    hin und schau, ob du dasselbe bekommst.

    return 0;
    }

    float summe(float x, float y)   {
          return (x + y);
          }

    Naja, eine grosse Hilfe war ich dir wohl kaum, aber setze die Deklarationen am richtigen Ort! Ich kann dir noch die Website http://www.pronix.de empfehlen. Auf ihr findest du einen riesigen C-Kurs von Jürgen Wolf. 1A, hätte den Titel SelfC verdient!

    MfG

    Tom2

    1. Hoi,

      Ich hab so zur Übung ein Programm versucht, das 2 Kommazahlen
      addieren soll, so weit so gut. Wenn ich jetzt aber zB 12.4 und
      45.67 eingebe, schreibt er mir hin : Die Summe von 12.400000
      und 45.669998 ergibt 58.070000 . Warum ist das so ?
      Warum das so ist kann ich dir leider nicht sagen.

      Dann sei doch still?
      Das wurde in den anderen Postings hier schoen klar und deutlich
      erklaert.

      Tritt der Fehler auch auf, wenn du double anstelle von float
      benutzst?

      Ja, allerdings nicht in einer so starken Form.

      #include <stdio.h>

      float x, y, z;
      Ohohohoh, was ist denn das?

      Eine Variablen-Deklaration, wahrscheinlich.

      Gehört das nicht in die main-Funktion?

      Das kommt darauf an.

      Oder gibt es eine neue Methode um globale Variablen in C zu
      deklarieren, von der ich nichts mitbekommen hab?

      Ganz offensichtlich.
      Globale Variablen werden *ueber* der Funktion 'main' deklariert.
      Variablen innerhalb von 'main' haben den Gueltigkeitsbereich nur
      innerhalb von 'main', nicht ausserhalb.

      float summe(float x, float y);

      int main(void)   {
      Hier gehört nun die deklaration hin:
             float x, y, z;

      Wenn sie nicht global sein sollen, ja. Ansonsten ist das falsch.

      Gruesse aus dem schoenen LH,
       c.j.k

      1. Hoi,

        Ich hab so zur Übung ein Programm versucht, das 2 Kommazahlen
        addieren soll, so weit so gut. Wenn ich jetzt aber zB 12.4 und
        45.67 eingebe, schreibt er mir hin : Die Summe von 12.400000
        und 45.669998 ergibt 58.070000 . Warum ist das so ?
        Warum das so ist kann ich dir leider nicht sagen.

        Dann sei doch still?

        Fertig lesen, denken, schreiben. Diese Zeile ist wohl ziemlich überflüssig.

        Das wurde in den anderen Postings hier schoen klar und deutlich
        erklaert.

        Ja, vielleicht wollte ich ihm jedoch sonst helfen? Ich lerne auch gerade erst C, desshalb konnte ich es nicht erklären. Die Postings à la 'das ist das und das, schau hier und dort' würden mir in diesem  Moment wenig nutzen, da ich das Problem zuerst selbst lösen will oder zumindest den Fehler lokalisieren.

        Tritt der Fehler auch auf, wenn du double anstelle von float
        benutzst?

        Ja, allerdings nicht in einer so starken Form.

        Vielleicht reicht das ja auch schon.

        #include <stdio.h>

        float x, y, z;
        Ohohohoh, was ist denn das?

        Eine Variablen-Deklaration, wahrscheinlich.

        Ja, das sehe ich auch.

        Gehört das nicht in die main-Funktion?

        Das kommt darauf an.

        Oder gibt es eine neue Methode um globale Variablen in C zu
        deklarieren, von der ich nichts mitbekommen hab?

        Ganz offensichtlich.
        Globale Variablen werden *ueber* der Funktion 'main' deklariert.
        Variablen innerhalb von 'main' haben den Gueltigkeitsbereich nur
        innerhalb von 'main', nicht ausserhalb.

        Jep, hab mich geirrt, sorry.

        float summe(float x, float y);

        int main(void)   {
        Hier gehört nun die deklaration hin:
               float x, y, z;

        Wenn sie nicht global sein sollen, ja. Ansonsten ist das falsch.

        Wesshalb sollten die Variablen global sein? er übergibt der Funktion Summe die Variablen x und y als Parameter. Diese heissen in der Funktion dann auch wieder x und y, was ich ein wenig verwirrend finde. In diesem Fall haben doch die lokalen Variablen vorrang oder?

        MfG

        Tom2

        1. Hoi,

          zunaechst lies mal http://learn.to/quote.

          Dann sei doch still?
          Fertig lesen, denken, schreiben. Diese Zeile ist wohl ziemlich
          überflüssig.

          Nein, Dein Ausgangsposting in der Form war hoechst ueberfluessig.

          Das wurde in den anderen Postings hier schoen klar und deutlich
          erklaert.
          Ja, vielleicht wollte ich ihm jedoch sonst helfen?

          Das hast du nicht, im Gegenteil. Es hat hoechstens mehr Verwirrung
          gebracht.

          Ich lerne auch gerade erst C, desshalb konnte ich es nicht
          erklären.

          Warum versuchst du es denn dann?
          Wie schon bereits mehrmals geschrieben wurde, haengt das damit
          zusammen, dass Komma-Zahlen im Binaer-System (in dem sie intern
          gehandelt werden) unter umstaenden periodisch sind, oder sogar
          irrational. 0,1 ist z. B. ein gutes Beispiel. Dafuer sind periodische
          Zahlen im Zehner-System u.U. leichter im Binaer-System darstellbar.

          Die Postings à la 'das ist das und das, schau hier und dort'
          würden mir in diesem  Moment wenig nutzen, da ich das Problem
          zuerst selbst lösen will oder zumindest den Fehler lokalisieren.

          Hast du die anderen Antworten ueberhaupt gelesen?

          Wesshalb sollten die Variablen global sein?

          Das musst du den OP fragen, nicht mich.

          er übergibt der Funktion Summe die Variablen x und y als
          Parameter. Diese heissen in der Funktion dann auch wieder x und y,
          was ich ein wenig verwirrend finde. In diesem Fall haben doch die
          lokalen Variablen vorrang oder?

          Ja.

          Gruesse aus dem nassen Muenster,
           c.j.k

          1. Hoi,

            Ok, ich hab zuviel Zitiert. Das Posting von Michael Schröpl http://forum.de.selfhtml.org/?m=53905&t=9607 hat mir aber um einiges besser gefallen als deins (bis auf deinen Link).
            Zuerst mal zu meinem ersten Postin. Ich habs (nochmals) nochmals durchgelesen und festgestellt, dass man es von oben herablassend verstehen könnte (so wie ich deine Postings übrigens auch verstehe, vieleicht nur eine Reaktion), war aber nicht so gemeint.

            Nein, Dein Ausgangsposting in der Form war hoechst ueberfluessig.

            Wohl kaum, denn:
            1. habe ich ihn auf eine mögliche Lösung, die Verwendung von double hingewiesen
            2. habe ich ihn auf einen Fehler (war keiner) hingewiesen (globale Variablen), da hat unser Informatiklehrer aber deftig geschlampt.
            Wenn ich das gewust hätte, hätte ich ihn darauf hingewiesen, dass es unklug ist, für globale Variablen und für Parameter dieselben Namen zu verwenden (in diesem Beispiel zumindest).
            3. Habe ich ihm den Link zu http://www.pronix.de gegeben, welcher ihm sicher in Zukunft weiterhelfen wird.

            Das hast du nicht, im Gegenteil. Es hat hoechstens mehr Verwirrung
            gebracht.

            Ja, mit meiner Fehlannahme habe ich Verwirrung gestiftet und es tut mir auch leid. Dafür habe ich wieder etwas dazugelernt.

            Ich lerne auch gerade erst C, desshalb konnte ich es nicht
            erklären.

            Warum versuchst du es denn dann?

            Weil ich dachte, dass ich ihm helfen könne und weil ich ihm den Link zu http://www.pronix.de geben wollte.

            Wie schon bereits mehrmals geschrieben wurde, haengt das damit
            zusammen, dass Komma-Zahlen im Binaer-System (in dem sie intern
            gehandelt werden) unter umstaenden periodisch sind, oder sogar
            irrational.

            Das war mir auch klar. Ich weiss nur nicht, wie der Fehler genau entsteht (ich meine die interne Aufteilung in Basis, Exponent und so) und wann und wie stark die Abweichungen sind.

            Hast du die anderen Antworten ueberhaupt gelesen?

            NC

            Wesshalb sollten die Variablen global sein?
            Das musst du den OP fragen, nicht mich.

            Das war mehr eine rhetorische Frage. In dem Beispiel stiftet es Verwirrung, da die Parameter der Funktion Summe gleich heissen.

            Gruesse aus dem nassen Muenster,

            Grüsse aus dem vergleichsweise sonnigen Ebikon (hähä, mer hend sonne! ;-)

            Tom2

            1. Hoi,

              Das Posting von Michael Schröpl http://forum.de.selfhtml.org/?m=53905&t=9607
              hat mir aber um einiges besser gefallen als deins (bis auf deinen
              Link).

              Ich habe meinen Stil, Michael hat seinen. Meiner mag manchmal etwas
              rauh klingen, aber gemeint ist er meist genau so wie Michaels.

              Zuerst mal zu meinem ersten Postin. Ich habs (nochmals) nochmals
              durchgelesen und festgestellt, dass man es von oben herablassend
              verstehen könnte

              Das habe ich gar nicht so empfunden ;-)

              Nein, Dein Ausgangsposting in der Form war hoechst
              ueberfluessig.
              Wohl kaum, denn:

              1. habe ich ihn auf eine mögliche Lösung, die Verwendung von
                double hingewiesen

              Nee, das ist keine Loesung. Das ist hoechstens ein abschwaechen
              der Symptome.

              1. Habe ich ihm den Link zu http://www.pronix.de gegeben,
                welcher ihm sicher in Zukunft weiterhelfen wird.

              Ja, das war sinnvoll. Aber nicht in der Form. Ich habe nicht gesagt,
              das Posting war generell sinnfrei -- es war nur in *der Form*
              sinnfrei.

              Das hast du nicht, im Gegenteil. Es hat hoechstens mehr
              Verwirrung gebracht.
              Ja, mit meiner Fehlannahme habe ich Verwirrung gestiftet und es
              tut mir auch leid. Dafür habe ich wieder etwas dazugelernt.

              Stimmt ;-)

              Ich lerne auch gerade erst C, desshalb konnte ich es nicht
              erklären.

              Warum versuchst du es denn dann?
              Weil ich dachte, dass ich ihm helfen könne und weil ich ihm den
              Link zu http://www.pronix.de geben wollte.

              Dann aendere die Form. Dein Posting war einfach nur verwirrend.

              Hast du die anderen Antworten ueberhaupt gelesen?
              NC

              Die Frage war ernst gemeint.

              Gruesse aus dem nassen Muenster,
              Grüsse aus dem vergleichsweise sonnigen Ebikon (hähä, mer hend
              sonne! ;-)

              Baeh ;-) Ich will auch Sonne.

              Gruesse,
               c.j.k

              1. Salü

                Ich habe meinen Stil, Michael hat seinen. Meiner mag manchmal etwas
                rauh klingen, aber gemeint ist er meist genau so wie Michaels.

                Ja, rauh geklungen hat er... Aber du bist ja gar nicht nicht so böse, wie ich am anfang gedacht habe. Wieder Freunde?

                1. habe ich ihn auf eine mögliche Lösung, die Verwendung von
                  double hingewiesen
                  Nee, das ist keine Loesung. Das ist hoechstens ein abschwaechen
                  der Symptome.

                Wenn seine Ansprüche an Genauigkeit durch die Verwendung von double erfüllt werden ist es eine Lösung. q.e.d. ;-)
                Das Problem der Ungenauigkeit kannst du nicht lösen. In diesem Beispiel ev. schon, aber im Allgemeinen nicht.

                Ich habe nicht gesagt,
                das Posting war generell sinnfrei -- es war nur in *der Form*
                sinnfrei.

                Einigen wir uns darauf, dass der erste Teil nicht besonders sinnvoll war? ;-)

                Hast du die anderen Antworten ueberhaupt gelesen?
                NC
                Die Frage war ernst gemeint.

                Natürlich habe ich die anderen Postings nicht gelesen! Die anderen sind alle Idioten und wissen sowieso nicht wovon sie schreiben. Leute wie die sollten das besser lassen. Dann ging es uns allen besser in diesem Forum (uns? moment mal,... dann wär ja nur noch ich da...) (Ich glaube, hier erübrigt die explizite erwähnung von einem ';-)')

                Baeh ;-) Ich will auch Sonne.

                Im sommer schiint d'sonne, im wenter do schneits: i de schwiz, i de schwiz, i de schwiz... :) (Naja, mit dem Reim klapts auf Schweizerdeutsch nicht so wirklich...)

                MfG

                Tom2, der nun wieder schmunzelt

                1. Hi Tom,

                  Ja, rauh geklungen hat er... Aber du bist ja gar nicht nicht
                  so böse, wie ich am anfang gedacht habe. Wieder Freunde?
                  Tom2, der nun wieder schmunzelt

                  sehnsewohl, es geht doch ... :-)

                  Viele Grüße
                        Michael

          2. Moin Christian!

            Wie schon bereits mehrmals geschrieben wurde, haengt das damit
            zusammen, dass Komma-Zahlen im Binaer-System (in dem sie intern
            gehandelt werden) unter umstaenden periodisch sind, oder sogar
            irrational.

            Rein intuitiv wuerde ich sagen, irrationale Zahlen sind immer irrational, egal in welchem Positionssystem, und rationale sind immer rational. Oder?

            Und spiel nich so viel am Server rum ... ;-) [1]

            [1] use CGI::Carp qw(fatalsToBrowser)  finde ich im Forumsskript ein bisschen deplaziert.

            So long

            --
            "Wenn ich über die steuer- und erbrechtliche Anerkennung von homosexuellen Paaren diskutiere, dann kann ich gleich über Teufelsanbetung diskutieren."
                -- Dr. Edmund Stoiber, 1991

            1. Hoi Roland,

              Wie schon bereits mehrmals geschrieben wurde, haengt das damit
              zusammen, dass Komma-Zahlen im Binaer-System (in dem sie intern
              gehandelt werden) unter umstaenden periodisch sind, oder sogar
              irrational.

              Rein intuitiv wuerde ich sagen, irrationale Zahlen sind immer irrational,
              egal in welchem Positionssystem, und rationale sind immer rational. Oder?

              Hm, jetzt, wo du es sagst, wuerde ich dir zustimmen.

              Und spiel nich so viel am Server rum ... ;-) [1]

              Da hab ich nix mit zu tun ;-)

              [1] use CGI::Carp qw(fatalsToBrowser)  finde ich im Forumsskript ein bisschen
              deplaziert.

              Ich nicht. Aber die Fehler lagen eher an DoS-Attacken...

              Gruesse aus dem schoenen LH,
               c.j.k

        2. Hi Tom,

          Dann sei doch still?
          Fertig lesen, denken, schreiben. Diese Zeile ist wohl ziemlich überflüssig.
          Ja, vielleicht wollte ich ihm jedoch sonst helfen?

          gut gemeint ist leider nicht dasselbe wie gut gemacht.
          Um aber Deinen guten Willen zu honorieren, ein paar Tips für die Zukunft:

          Niemand zwingt Dich, bei einer Antwort auf _alle_ Fragen des Fragestellers einzugehen.
          Teil-Antworten wie "weiß ich auch nicht" sind wirklich überflüssig, zumal der Leser aus Deinem Posting ja erst mal mühsam heraussuchen muß, wo Du etwas zu sagen hast und wo Du nur mit den Schultern zuckst.

          Deshalb: Lösche alles weg, was Du nicht kommentieren willst, und beantworte nur genau diejenigen Teile, bei denen Du Dir (relativ) sicher bist, daß Du etwas Nützliches beizutragen hast. Ich mache das auch nicht anders, und spätere Leser bekommen auf diese Weise genau das zu sehen, was ich als Inhalt beizusteuern hatte, keinen zusätzlichen Ballast aus Deinem oder vorherigen Postings.
          Wenn Du drei Zeilenbeizutzragen hast (welche durchaus wertvoll sein könnten!), dann poste drei Zeilen - und nicht hundert.

          Es hilft dem Fragesteller wenig, wenn Du irgendwas rätst - vor allem dann nicht, wenn andere Leser bereits die richtige Antwort gegeben haben (denn das Lesen aller Beiträge eines Threads ist für das Antworten ebenfalls äußerst wichtig - Dein Beitrag kann noch so korrekt sein, er wäre trotzdem überflüssig, wenn jemand die Frage bereits erschöpfend beantwortet hat).

          Viele Grüße
                Michael

          1. Hallo Michael

            Zuerst einmal Danke für deine freundliche und hilfsbereite Antwort, ich habe auch andere bekommen, oder zumindest solche, die ich anders verstanden habe.

            gut gemeint ist leider nicht dasselbe wie gut gemacht.

            Ja, leider.

            Niemand zwingt Dich, bei einer Antwort auf _alle_ Fragen des Fragestellers einzugehen.
            Teil-Antworten wie "weiß ich auch nicht" sind wirklich überflüssig,

            Er hatte ja auch nur eine Frage und zwar nach dem 'Warum'. Da ich aber einen Fehler sah (der keiner war) habe ich xNeTworKx darauf aufmerksam machen wollen, ihm einen Lösungsansatz gegeben und ihm vorallem den Link zu http://www.pronix.de geben wollen.

            zumal der Leser aus Deinem Posting ja erst mal mühsam heraussuchen muß, wo Du etwas zu sagen hast und wo Du nur mit den Schultern zuckst.

            Dies mache ich normalerweise auch nicht und werde es auch nie wieder tun. Grosses Indianer-Ehrenwort.

            Es hilft dem Fragesteller wenig, wenn Du irgendwas rätst

            Was habe ich geraten?

            • vor allem dann nicht, wenn andere Leser bereits die richtige Antwort gegeben haben

            Es ging mir ja nicht um die Beantwortung der Frage selbst, sondern um einen Hinweis auf den Quelltext in seinem Beispiel und um den Link.

            MfG

            Tom2

  3. Hallo,

    Ich hab so zur Übung ein Programm versucht, das 2 Kommazahlen addieren soll, so weit so gut. Wenn ich jetzt aber zB 12.4 und 45.67 eingebe, schreibt er mir hin : Die Summe von 12.400000 und 45.669998 ergibt 58.070000 . Warum ist das so ?

    Warum das so ist, haben ja schon andere klar gemacht.

    Was für Dich relevant ist, sind die ANSI-C Funktionen modf() und frexp(), ldexp() enthalten in math.h. Nicht vergessen auch die libmath einzubinden beim Linken!

    Ist zwar ein wenig aufwendig, aber halt ANSI-C ;-)

    so short

    Christoph Zurnieden