Runden ?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • in den Language Fundamentals habe ich folgendes gefunden:

      "
      Wenn ein Long einem Single zugewiesen wird, wird die Zahl nach den Regeln des IEEE-Komitee abgerundet.
      Zur Erläuterung: 1,500000 ist exakt die Mitte zwischen 1,000000 und 2,000000. Wird x,500000 immer aufgerundet, so ist der Trend aller Rundungen höher, als der Durchschnitt aller tatsächlichen Werte. Die Regel besagt aus diesem Grund abwechselnd auf- und abzurunden, wenn der Wert hinter dem LSB exakt ,500000000 ist.
      Die Regel ist: Runde ,500000000000 zur nächsten ganzen Zahl auf. Bei der folgenden ,500000000000 wird nichts unternommen, der Bruchteil verfällt also.
      Da dies im Wechsel stattfindet ist die Summe der Fehler 0 (NULL).
      "
      der erste Satz wäre ja die Erklärung dafür, dass beim Runden immer der Zwischenschritt
      X_single = round(X_single) und dann erst
      x_Long = X_single erfolgen muss, richtig?

      Im Umkehrschluss könnte ich damit doch dann auch immer den Ganzzahlanteil einer Single ermitteln?

      der zweite Satz mit den x.50000000 kann aber doch zu einem Fehler führen, wenn ich nur ein einziges mal diese Rundung ausführe (das Programm weiß ja nicht, ob noch eine kommt?)
      das ist zwar etwas unwahrscheinlich, aber ist das wirklich so gemeint?
      Gruß
      Hans
    • Warum muss ich runden, wenn ich eine Ganzzahl (long) in eine Flieskommazahl (single) überführen will? Ich gehe bei diesem Eintrag der Hilfe von einem Wortdreher aus. Andersrum macht es für mich einen Sinn.

      Es wird aus meiner Sicht ein Spezialfall angesprochen, eben diese 0.500000000... Wenn ich viele von diesen Zahlen jeweils in ein long wandle, dann müsste ich mal auf-, mal abrunden, um bei der anschließenden Summe der long keinen (wenn beide Fälle gleich oft vorkommen) Fehler zu haben. Addiere ich gleich die single und überführe diese Summe in ein long, dann runde ich ein mal und der Fehler ist der gleiche.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • Hans_L schrieb:

      Wenn ein Long einem Single zugewiesen wird, wird die Zahl nach den Regeln des IEEE-Komitee abgerundet.
      meintest du das nicht umgekehrt?
      Ein Long ist eine Festkommazahl und wenn du die einem Single zuweist, dann macht der eben komma Null (im Rahmen der Single Genauigleit)
      Umgedreht wird die Kommastelle abgeschnitten. Das kann men, wenn man will, natürlich als abrunden bezeichnen.


      Hans_L schrieb:

      das ist zwar etwas unwahrscheinlich, aber ist das wirklich so gemeint?

      Normalerweise wird bei genau ,5000 zur nächsten geraden Zahl gerundet, das sieht natürlich aus, als ob es abwechselnd passiert, so ist das aber nicht gewollt gewesen ;)
    • Ich hab nochmal versucht, den Text zu verstehen. Wenn der ganzzahlige Teil ungerade ist Lsb=1, dann wird aufgerundet, bei geradzahligem Teil abgerundet. Dann müsste aus 1,5 eine 2 werden, und bei 2,5 auch eine 2 werden. Siehst du das auch so?

      Das kann man aber mit der lib abschalten.

      So ein Rundungsverhalten kann ich nicht feststellen. Bei meinem Test wird immer aufgerundet, egal ob von 1,5 auf 2 oder von 2,5 auf 3. Es geht in dem Text doch auch nur um den Fall x,50000... also x,500000001 wird immer nach oben gerundet.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von tschoeatsch ()

    • ja, aber wie interpretierst du den Text aus der Hilfe zum Thema Runden?

      Rounding
      When a Long is assigned to a single, the number is rounded according to the rules of the IEEE committee.
      For explanation: 1.500000 is exact the middle between 1.00000 and 2.000000. If x.500000 is always rounded up, than there is trend for higher values than the average of all numbers. So their rule says, half time to round up and half time to round down, if value behind LSB is exact ..500000000.
      The rule is, round this .500000000000 to next even number, that means if LSB is 1 (half time) to round up, so the LSB is going to 0 (=even), if LSB is 0 (other half time) to round down, that means no rounding.
      This rounding method is best since the absolute error is 0.
      You can override the default IEEE rounding method by specifying the $LIB LONG2FLOAT.LBX library which rounds up to the next number. This is the method used up to 1.11.7.4 of the compiler.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hier ein Auszug aus IEEE 754:

      Rundungen
      IEEE 754 unterscheidet zunächst zwischen binären Rundungen und binär-dezimalen Rundungen, bei denen geringere Qualitätsforderungen gelten.
      Bei binären Rundungen muss zur nächstgelegenen darstellbaren Zahl gerundet werden. Wenn diese nicht eindeutig definiert ist (genau in der Mitte zwischen zwei darstellbaren Zahlen), wird so gerundet, dass das niederwertigste Bit der Mantisse 0 wird. Statistisch wird dabei in 50 % der Fälle auf-, in den anderen 50 % der Fälle abgerundet, so dass die von Knuth beschriebene statistische Drift in längeren Rechnungen vermieden wird.
      Eine zu IEEE 754 konforme Implementierung muss drei weitere vom Programmierer einstellbare Rundungen bereitstellen: Rundung gegen +Unendlich (immer aufrunden), Rundung gegen −Unendlich (immer abrunden) und Rundung gegen 0 (Ergebnis immer betragsmäßig verkleinern).

      Ist also genau das was in der Bascom-Language Fundamentals steht und unter kaufmännischem Runden zu verstehen ist, da ein Ehrlicher Kaufmann (so heißt das wirklich) ja durch Runden keinen Gewinn erzielen will.
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • Aha, das bedeutet, dass das kaum zu merken ist, weil die nicht darstellenden Zahlen eher sehr klein sind. Bei einer Zuweisung einer single zu einem long fällt das also nicht auf, weil das nur die hinteren Stellen der Nachkommastellen betrifft.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------