Seite 3 von 4

Verfasst: 27.01.2006 15:41
von ts-soft
Falko hat geschrieben:Wenn jemand Lust hat, dieses in PB umzusezten, dann kehrt Ruhe ein :mrgreen:

http://vb-tec.de/runden.htm
Noch brauchen wir in PB keine Variant zu runden :wink:

Verfasst: 29.01.2006 12:38
von Gimbly
Schande über mich! Das mit dieser Rechenungenauigkeit war mir tatsächlich noch nie aufgefallen. :oops:
Muss daran liegen, dass die Programmiersprachen, die ich bisher benutzt habe, intelligente Round-Befehle haben.

Verfasst: 29.01.2006 14:23
von Zaphod
ist aber sehr wichtig zu wissen, denn das führt zu (mindestens) zwei grundlegenden erkenntnissen:

- man vergleicht *niemals* gleitkommazahlen auf gleichheit, sondern nur mit tolleranz

- "traditionelle" gleitkomma zahlen sind ungeeignet für finanz berechnungen (ausnahme "Decimal" aus dem .Net framework)

Verfasst: 29.01.2006 15:36
von Pinhead
Offensichtlich scheinen hier einige Leute nicht zu
wissen, daß das Teil vor ihrer Nase das sie Rechner
nennen alles mögliche kann aber sicherlich nicht
richtig mit Floats rechen.

Mal was zum lesen:

http://de.wikipedia.org/wiki/Numerik#Fehleranalyse
http://de.wikipedia.org/wiki/Gleitkommazahl

Das hab ich Mathstuduim benutzt:
Numerische Mathematik von Josef Stoer (Springer Verlag)

Besonder das Kapitel 'Rundungsfehler bei Gleitpunkberechnung'
ist interesannt

Verfasst: 29.01.2006 15:58
von Zaphod
haben wir jetzt schon mehrfach geklärt.

Verfasst: 30.01.2006 01:58
von Toshy
Gimbly hat geschrieben:Klar kann der arme round-Befehl 60.000004 nur zu 61 aufrunden, aber er darf nicht 100 * 0.6 zu 61 aufrunden.

Der Bug besteht natürlich dadrin, dass 100 * 0.6 falsch gerechnet wird.

Das kenne ich aus C und Delphi anders.
Das ist kein Bug. Du übersiehst nur was. Das 60.000004 nur zu 61 ist dir ja nun klar, liegt daran, das es ein Floatwert ist. Was du aber übersiehst ist, das "100 * 0.6" auch als Float berechnet wird. In der Berechnung kommt 0.6 vor, also ist das ein Float. Intern wir "100 * 0.6" also auch mit "100 * 0.00000004" (könnte mich jetzt um ne Stelle vertippt haben). Also ist 61 als Ergebnis wieder richtig.
Gruß
Thorsten

Verfasst: 30.01.2006 02:02
von Froggerprogger
Die Redundanz in diesem Thread steigt enorm. Mittlerweile wurden sämtliche Punkte schon mehrfach erwähnt.
Selbst der Punkt, dass wir das jetzt schon mehrfach geklärt haben, haben wir hiermit schon zum zweiten Mal geklärt.

Verfasst: 30.01.2006 02:13
von freedimension
Froggerprogger hat geschrieben:Die Redundanz in diesem Thread steigt enorm. Mittlerweile wurden sämtliche Punkte schon mehrfach erwähnt.
Selbst der Punkt, dass wir das jetzt schon mehrfach geklärt haben, haben wir hiermit schon zum zweiten Mal geklärt.
Du wiederholst die Aussage von Zaphod :roll:

<)

Verfasst: 30.01.2006 10:10
von Karl
Benutz die Rundungsfunktion in der Rubrik Codeschnipsel!

Ansonsten bestehen Fließkommazahlen aus

einem Vorzeichen (1 Bit)
einer Charakteristik (ab 8 Bit) und
einer Mantisse (ab 23 Bit -> die Eins vor dem Komma wird nicht dargestellt!).

Versuche 0.6 als Mantisse 0<M<=1.1bin darzustellen:

1/2 1/4 1/8 1/8 ... 1/

0.5 -> 10...0 (ist einfach)

nun noch das restliche Zehntel darstellen
1/8 ist zu groß -> 1/16
bleiben 0.0375 usw.

Wie du siehst, ergibt sich zwangsläufig eine Rundung, weil nur Summen von Potenzen von 2 genau dargestellt werden können. So hast du beispielsweise bei 0.75 keinen Rundungsfehler.

Gruß Karl

Verfasst: 30.01.2006 10:54
von freedimension
Karl hat geschrieben:einem Vorzeichen (1 Bit)
einer Charakteristik (ab 8 Bit) und
einer Mantisse (ab 23 Bit -> die Eins vor dem Komma wird nicht dargestellt!).
Also ich nannte das bisher immer Exponent, aber man lernt ja nie aus. Wo hast du diesen Ausdruck her?