PB kann nicht rechnen!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
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

Beitrag 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:
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.
Bild
Gimbly
Beiträge: 169
Registriert: 28.12.2005 14:26
Wohnort: NRW

Beitrag 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.
Gruß
Markus
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag 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)
Benutzeravatar
Pinhead
Beiträge: 85
Registriert: 05.09.2005 20:30
Wohnort: HD

Beitrag 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
Man macht sich immer übertriebene Vorstellungen von dem, was man nicht kennt.
(Albert Camus, franz. Schriftsteller, 1913-1960)
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

haben wir jetzt schon mehrfach geklärt.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag 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
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag 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.
!UD2
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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:

<)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag 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?
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten