Rundet "Round" falsch ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Rundet "Round" falsch ?

Beitrag von NicknameFJ »

Hallo,

ist das ein Bug oder bin ich der BUG ?

Code: Alles auswählen

dummy.q = Round(9002018*6/10,0)  ; sollte eigentlich abrunden, rundet aber auf !!!
Debug dummy

dummy = 9002018*6/10   ; sollte auch abrunden da Ganzzahlen als Ergebnisvariable verwendet wird- tut es auch 
Debug dummy

Test.d = 9002018*6/10  ; das exakte Ergebnis ist - naja fast aber das verstehe ich
Debug Test

getestet mit PB 4.50

kann das jemand bestätigen

Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rundet "Round" falsch ?

Beitrag von STARGÅTE »

Wichtiger Hinweis:

Round() rundet zwar auf eine ganze Zahl, gibt jedoch eine Float zurück, um ein Overflow bei großen Zahlen zu verhindern !

Außerdem ist der Parameter auch "nur" eine Float!

Nun zum Problem:
Diese Zahl: 9002018*6/10 wird bereits vorher schon zu 5401211.0 und nicht wie man meint zu 5401210.8, oder halt 5401210.799..., auf Grund der Float-Ungenauigkeit!

Code: Alles auswählen

Float.f = 9002018*6/10
Debug Float
Deswegen rundet Round() hier richtigerweise "ab" auf 5401211.0, also 5401211 ...

Beim andere Fall (ohe Round) macht PB automatisch auf dem Ergebniss eine Double, und wandelt es dann in die Quad, wobei dabei dann 5401210.8 zu 5401210 wird.

Also: Kein Bug!
Round() ist halt zur zeit nur für Floats!
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
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: Rundet "Round" falsch ?

Beitrag von NicknameFJ »

STARGÅTE hat geschrieben:
Round() ist halt zur zeit nur für Floats!
Außerdem ist der Parameter auch "nur" eine Float!
Wußte ich nicht, bzw. war mir im Moment nicht bewusst (ja es steht in der Hilfe, da die Parameter und der Rückgabewert mit .f gekennzeichnet sind )

Danke Dir Stargate für die Erklärung.

Grüße

NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Re: Rundet "Round" falsch ?

Beitrag von Batze »

STARGÅTE hat geschrieben:Round() ist halt zur zeit nur für Floats!
Wie leider die ganze Math-Library, was etwas nervig ist.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rundet "Round" falsch ?

Beitrag von STARGÅTE »

Wenn alles für Doubles wäre, wäre es genauso schlecht, weil dann Berechnungen unter x86 sehr viel langsammer wären.

Und für alle Funktionen ein zusätzliches ...D() zu integrieren ist auch nicht das wahre, um Doubles anzubieten.

Ich weiß leider nicht in wie fern es möglich ist, dass PB beim Compilieren "selber" entscheidet wie eine Procedure wie Sin() im enteffekt rechnet, dass heißt, jenachdem ob eine Float oder Double übergeben wurde, auch damit rechnet.
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
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Re: Rundet "Round" falsch ?

Beitrag von Batze »

Naja man müsste vielleicht sowas wie integer auch für floats einführen, sodass der Code schön praktisch bleibt. Und hängt was schneller ist tatsächlich von x86 oder x64 ab?
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rundet "Round" falsch ?

Beitrag von STARGÅTE »

>> "Naja man müsste vielleicht sowas wie integer auch für floats einführen, sodass der Code schön praktisch bleibt."

Jo hatte da schon so meine Ideen ^^:

Code: Alles auswählen

CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
  Macro f_or_d : d : EndMacro
CompilerElse
  Macro f_or_d : f : EndMacro
CompilerEndIf 
>> "Und hängt was schneller ist tatsächlich von x86 oder x64 ab?"

Bewiesen wurde es zwar hier nicht, aber zumindest wurden einige Tests gemacht.
http://www.purebasic.fr/german/viewtopi ... 40#p278640

Zumindest bei mir unter 32Bit ist Double 4 mal lansammer bei einer Multiplikation.
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
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: Rundet "Round" falsch ?

Beitrag von freak »

STARGÅTE hat geschrieben:Round() ist halt zur zeit nur für Floats!
Das stimmt so nicht. Siehe Hilfe:
Die meisten dieser Funktionen arbeiten mit Fließkommazahlen, d.h. mit Zahlen einfacher (.f) oder doppelter (.d) Genauigkeit. Wenn eine Funktion mit einem Double-Wert als Eingabe oder Ausgabe verwendet wird, wird für die Berechnung automatisch auf doppelte Genauigkeit (Double) anstelle einfacher Genauigkeit (Float) umgeschaltet.
http://www.purebasic.com/german/documen ... index.html

Es wird eine Double-Version von Round() verwendet wenn entweder die Eingabe oder die Ausgabe ein Double-Wert ist. Das ist hier aber nicht der Fall. Die Eingabe ist eine feste Zahl ohne Typ, desshalb wird hier die Float-Version genommen.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Rundet "Round" falsch ?

Beitrag von STARGÅTE »

OK, danke für den Hinweis, jedoch stimmt das meiner Meinung nach nicht!
Wenn eine Funktion mit einem Double-Wert als Eingabe oder Ausgabe verwendet wird, [...]
Das stimmt hier aber nicht ganz, denn scheinbar reicht ein ODER nicht aus.
Ist die Eingabe bei Round() eine Double, rundet er trotzdem falsch:

Code: Alles auswählen

Double.d = 9002018.0*6/10
Debug Double
Quad.q = Round(Double,0)
Debug Quad
Double2.d = Round(Double,0)
Debug Double2
Nur dann wenn Eingabe und Ausgabe eine Double ist, rundet er richtig.
Oder übersehe ich jetzt meiner Seits etwas ?

Das es bei andere Funktionen mit ODER geht habe ich inzwischen gesehen.
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
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Re: Rundet "Round" falsch ?

Beitrag von Batze »

In der Hilfe steht bei fast allem als Parameter Float, also habe ich das mal geglaubt.
Wenn das doch schon automatisch umstellt und Round nur vergessen wurde, wäre das ja doch eine art Bug.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Antworten