Announcement

Collapse
No announcement yet.

Mal was zum grübeln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mal was zum grübeln

    Hy,<br>
    mir ist beim arbeiten was aufgefallen:<bR>
    <br>
    <b>float</b> a=0.01;<bR>
    <b>float</b> b=0.00;<bR>
    <b>float</b> c=b-a;<bR>
    ShowMessage(c);<br>
    <br>
    nehme ich jetzt Double's dann gehts ansonsten nich.<bR>
    Hat einer vieleicht eine Erklärung dafür?<bR>
    <b>mfg.: </b>Andre´

  • #2
    axo ich sollte *hab ich trotel vergessen zu erwähnen*<bR>
    das c so nicht -0.01 ist sodnern 0.099999**

    Comment


    • #3
      Hi Andre,

      du meinst sicher 0.0099999 !!!

      Wenn du es formatierst ist es wieder richtig: FormatFloat("#0.0000",c);

      Darum benutze ich nie float, sondern immer nur double oder Extended.

      Bye - Pete

      Comment


      • #4
        Auch der Datentyp Double schützt Dich vielleicht genau in dem Falle, aber nicht universell. Solche Fehler können einfach passieren, weil die Fliesskommazahlen nun mal nicht so gespeichert werden, wie es auf dem Bildschirm erscheint und wenn dann die letzte Ziffer kippt, hast Du genau den Effekt. Schau Dir mal <b>Currency</b> an, wenn Du mit Währungen rechnest.<p>
        Schöne Grüße, Mario Noac
        Schöne Grüße, Mario

        Comment


        • #5
          hi mario,

          bist jetzt doch auf c++ umgestiegen?

          gruß

          marku
          Herzliche Grüße

          Markus Lemcke
          barrierefreies Webdesign

          Comment


          • #6
            Hallo Markus,<p>
            nein. Aber die Problematik ist in Delphi die gleiche, so arg unterscheiden sich Delphi und Builder dann nicht, zumindest nicht in diesen Punkten.<p>
            Schöne Grüße, Mario Noac
            Schöne Grüße, Mario

            Comment


            • #7
              Hallo<BR>
              das ist ja auch i.d.R. kein Thema des Compilers, sondern eine prinzipielle Angelegenheit in der Informatik. Die Rechnerarchitektur (FPP) entscheidet da auch noch mit, wie gerundet wird etc. Da gibt's tonnenweise Literatur drüber.<BR>Nur in seltenen Fällen wirkt sich die Compilerarchitektur aus, je nach dem wie die FPU da genutzt wird. Beim C++ Builder und Delphi geh ich davon aus, dass intern die gleichen Mechanismen zum Rechnen verwendet werden.
              <BR>
              Armi

              Comment


              • #8
                Genau dieses Phänomen hat mich bei einem Buchhaltungsprojekt fast die Männer mit den weißen Jacken rufen lassen. :-)

                Addiere mal aus ein paar Tabellen ca. 68000 float Zahlen, erstelle daraus eine Bilanz und wundere dich warum die um 1-4 Pfennige (heute halt Cent) nicht aufgeht.

                Voller Wehmut dachte ich an die Numerik Vorlesung während meines Informatikstudiums ........

                .... hab mir dann eben ne eigene Klasse für das Projekt geschrieben.

                Mann

                Comment


                • #9
                  Hallo Manni,

                  wenn man Programme schreibt, die mit Geld zu tun haben, dann verwendet man keine Fliesskommazahlen, sondern Integer, dann entstehen auch keine Rundungsfehler, selbst wenn man unendlich viele Bilanzen macht

                  Comment


                  • #10
                    Hi,

                    das ist zwar eine alte Diskussion, ich wollte aber trotzdem noch ergänzend meinen Senf dazu geben.
                    Das Grundproblem ist meines Erachtens, daß für die Repräsentation eines float-Wertes nur 32 bit zur Verfügung stehen. Eine unendlich große Menge an Zahlen ("überabzählbar unendlich", falls ich mich richtig erinnere) wird also auf eine endliche abgebildet. Das geht natürlich nicht, da nicht jede reelle Zahl ein Bitmuster abbekommt.<br>
                    Das heißt, der 0.01 wird eben zufällig kein Bitmuster zugeordnet. Daher muß gerundet werden. Bestimmte andere Zahlen wiederum werden exakt auf ein Bitmuster abgebildet.

                    Gruß,<br>
                    Ja

                    Comment

                    Working...
                    X