Seite 1 von 2

Rundet "Round" falsch ?

Verfasst: 14.10.2010 19:41
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

Re: Rundet "Round" falsch ?

Verfasst: 14.10.2010 20:52
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!

Re: Rundet "Round" falsch ?

Verfasst: 14.10.2010 22:19
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

Re: Rundet "Round" falsch ?

Verfasst: 15.10.2010 01:00
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.

Re: Rundet "Round" falsch ?

Verfasst: 15.10.2010 01:09
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.

Re: Rundet "Round" falsch ?

Verfasst: 15.10.2010 01:19
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?

Re: Rundet "Round" falsch ?

Verfasst: 15.10.2010 01:52
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.

Re: Rundet "Round" falsch ?

Verfasst: 15.10.2010 02:50
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.

Re: Rundet "Round" falsch ?

Verfasst: 15.10.2010 03:21
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.

Re: Rundet "Round" falsch ?

Verfasst: 15.10.2010 04:28
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.