Noch brauchen wir in PB keine Variant zu rundenFalko hat geschrieben:Wenn jemand Lust hat, dieses in PB umzusezten, dann kehrt Ruhe ein![]()
http://vb-tec.de/runden.htm
PB kann nicht rechnen!
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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)
- 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)
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
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
Man macht sich immer übertriebene Vorstellungen von dem, was man nicht kennt.
(Albert Camus, franz. Schriftsteller, 1913-1960)
(Albert Camus, franz. Schriftsteller, 1913-1960)
-
Toshy
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
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.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.
Gruß
Thorsten
- Froggerprogger
- Badmin
- Beiträge: 855
- Registriert: 08.09.2004 20:02
- freedimension
- Admin
- Beiträge: 1987
- Registriert: 08.09.2004 13:19
- Wohnort: Ludwigsburg
- Kontaktdaten:
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
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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
PB 5.X
- freedimension
- Admin
- Beiträge: 1987
- Registriert: 08.09.2004 13:19
- Wohnort: Ludwigsburg
- Kontaktdaten:
