Wie rechnet man mit Purebasic richtig?

Anfängerfragen zum Programmieren mit PureBasic.
ath
Beiträge: 12
Registriert: 19.10.2010 19:58

Wie rechnet man mit Purebasic richtig?

Beitrag von ath »

Hi,

wie kann man mit Purebasic richtig rechnen? Folgender Code liefert bspw. das falsche Ergebnis:

Code: Alles auswählen

betrag.f = 163.49
If betrag - Int(betrag) < 0.49
  Debug "< 50 Cent"
  Debug betrag
  Debug Int(betrag)
  Debug betrag - Int(betrag)
Else  
  Debug "> 50 Cent"
  Debug betrag
  Debug Int(betrag)
  Debug Int(betrag+1) - betrag
EndIf  
In diesem Beispiel meint PB die Differenz sei größer 50 Center, was sie nicht ist, da Betrag mit 163.49000549316406 ausgewiesen wird. Bei der Gelegenheit direkt die nächste Frage: Wie rundet man in PB auf eine exakte Anzahl von Nachkommastellen? Up, Down und Nearest helfen da nicht weiter.

Danke und Gruß
Andreas
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

Re: Wie rechnet man mit Purebasic richtig?

Beitrag von ts-soft »

Die Suchfunktion sollte Deine Fragen beantworten, oder hier: http://de.wikipedia.org/wiki/Gleitkommazahl
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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie rechnet man mit Purebasic richtig?

Beitrag von STARGÅTE »

Wenns um Geld geht immer in Cents rechnen ! und nicht in Euros!

PB und alle andere Programmiersprachen rechnen mit Fließkommazahlen die immer eine ungenauigkeit haben (schon 1000 mal im Forum durchgekaut (keine Lust mit Links zu posten, sry)

Du kannst ja später immer noch die Cents wieder in Euros umrechnen, aber erst bei der Anzeige !

Code: Alles auswählen

betrag.q = 16349 ; Cent
If betrag%100 < 50
  Debug "< 50 Cent"
  Debug StrF(betrag/100.0,2)
Else  
  Debug "> 50 Cent"
  Debug StrF(betrag/100.0,2)
EndIf  
Außerdem ist ja deine Prüfung falsch:

Code: Alles auswählen

If betrag - Int(betrag) < 0.49
  Debug "< 50 Cent"
Wieso < 0.49 ? also ist ja 0.49 falsch, also ist das ergebnis deines Codes eh richtig ..
wenn du schon im Debug schreibst < 50Cent
dann nutze auch <0.50 ..
aber wie gesagt, rechne mit Ganzen Zahlen und in Cents ...

Ausgabe dann über StrF(Betrag/100.0, 2) damit teilst du duch 100 und nimmst 2 nachkommastellen.
Edit: (Beachte aber auch hier, das wieder rundungsfehler auftreten!) also besser noch ausgabe in Cents!
oder selbst das Komma setzen.
Zuletzt geändert von STARGÅTE am 15.11.2010 20:57, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Riacon
Beiträge: 61
Registriert: 21.01.2008 09:40

Re: Wie rechnet man mit Purebasic richtig?

Beitrag von Riacon »

ich bin jetzt vielleicht etwas spät, aber...

betrag.f = 163,49
Int(betrag)=-163,--
-------------------------
differenz 0,49

das ist offensichtlich NICHT größer als 0,49
also wird der else zweig der abfrage genommen. und da steht: Debug "> 50 Cent"
nicht weil pb so rechnet, sondern du :wink:
try this:

Code: Alles auswählen

betrag.f =163.49
debug(betrag-int(betrag))
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie rechnet man mit Purebasic richtig?

Beitrag von STARGÅTE »

Er fragt oben ab ob
betrag.f = 163.49
If betrag - Int(betrag) < 0.49
ist,
Da steht eindeutig, ob es KLEINR ist als 0.49 !
Diese Aussage ergibt Falsch, denn betrag - Int(betrag) ist 0.49 !
Also geht es in den Else-Zweig, was er dann da schreibt, von wegen > 50 Cent, hat er geschrieben, nicht PB.

PB rechnet vollkommen richtig ...

Meine Frage an dich also: Worauf willst du hinaus ?

Im übrigen bekommst du bei JEDER Programmiersprache, die mit Floats rechnet (was du ja hier machst)
0.4900054931640625
Daran ist nicht falsch oder verbugt, das ist so!
(Links sind genügend vorhanden)

Edit: Sry meine Antwort ist irgendwie schräg ...
Zuletzt geändert von STARGÅTE am 24.11.2010 08:05, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Wie rechnet man mit Purebasic richtig?

Beitrag von PureLust »

Was Riacon vermutlich sagen will ist, dass das ursprüngliche Beispiel von ath einfach komplett falsch ist.

Wie Du ja selber oben bereits festgestellt hattest, fragte ath fälschlicherweise ab, ob 0.49 < 0.49 ist und geht dann in die ELSE-Anweisung in der dann behauptet wird 0.49(00054931640625) sei > 0.50.

Richtig wäre der code (und eben die Auswertung) so:

Code: Alles auswählen

betrag.f = 163.49
If betrag - Int(betrag) < 0.50
  Debug "< 50 Cent"
  Debug betrag
  Debug Int(betrag)
  Debug betrag - Int(betrag)
Else  
  Debug ">= 50 Cent"
  Debug betrag
  Debug Int(betrag)
  Debug Int(betrag+1) - betrag
EndIf 
Dann wäre (selbst bei Rundungsfehlern) die korrekte Ausgabe "< 50 Cent" heraus gekommen.

(Zumindest hab ich Riacons Post so verstanden. :roll: )
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten