Grundlegende Frage zu Float/Double Variablen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Skabus

Betreff: Grundlegende Frage zu Float/Double Variablen

BeitragMo, Dez 28, 2009 2:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin schon mehre Male auf eine kuriose Tatsache gestoßen, die aber zum Glück bissher immer umgangen werden konnte...

Nun stellt sie mir ein ziemliches Bein.Problem ist folgendes.
Aus der normalen Mathematik wissen wir, dass wenn wir einen Wert um eine gebrochenrationale Zahl
verringern oder vergrößern wir bei entsprechender Einstellung wieder auf eine ganze Zahl kommen.
Beispiel:

Wenn ich 1/2 + 1/2 rechne bekomme ich ein Ganzes, was eine ganze Zahl darstellt.
Und wenn ich 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 rechne bekomme ich
ebenfalls ein ganzes raus, bzw. wenn ich 10 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1
rechne, so bekomme ich eine glatte 9...

Scheinbar will BMax das nit, und ich hab kA warum.Sicher liegt es daran, dass sowohl float als auch double
bösartig runden,intern, und ich deswegen, mich zwar im oben genannten Beispiel, der 9 annähre sie aber nicht
erreiche, bzw, über sie hinaus gehe.

Leider benötige ich genau diese Beziehung und genau dieses glatte Ergebnis und kann programmbedingt
auch nicht einfach in Int konvertieren.Weil für ihn dann z.b. 9.2 und 9.3 ein und das selbe wären, was
mein Programm allerdings nicht korrekt arbeiten lässt...

Wäre nett wenn mir jemand sagen könnte, was ich evtl. falsch mache, oder wie ich dieses Problem umgehen
kann.

Für jegliche Hilfe bin ich wie immer sehr dankbar^^

MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Xeres

Moderator

BeitragMo, Dez 28, 2009 2:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Rechne stattdessen:
100 - 1 - 1 ...
und ermittle das Endergebnis erst zum schluss: Ergebnis / 10.0
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Mo, Dez 28, 2009 17:31, insgesamt einmal bearbeitet

Skabus

BeitragMo, Dez 28, 2009 2:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahja, ich bin blöd Rolling Eyes

Da hätte ich selber drauf kommen müssen.Dank dir^^



MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

hazumu-kun

BeitragMo, Dez 28, 2009 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich traurig das die mangelnde Genauigkeit bei einem Float einen dazu zwingt Performance zu verschenken.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
 

FWeinb

ehemals "ich"

BeitragMo, Dez 28, 2009 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wage zu bezweifeln, das der Unterschied in der Berechnungszeit zwischen 100 - 1 und 10-0.1 so groß ist, dass man hier von "Performance" verschenken sprechen kann. Ganz im Gegenteil ich gehe sogar davon aus, das es für den Computer "einfacher" sein müsste 100 - 1 zu rechnen als 10-0.1

MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Alfadur

BeitragMo, Dez 28, 2009 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ich hat Folgendes geschrieben:
Ich wage zu bezweifeln, das der Unterschied in der Berechnungszeit zwischen 100 - 1 und 10-0.1 so groß ist, dass man hier von "Performance" verschenken sprechen kann. Ganz im Gegenteil ich gehe sogar davon aus, das es für den Computer "einfacher" sein müsste 100 - 1 zu rechnen als 10-0.1

MfG
ich


aber wenn man eben nicht 100 - 1 will, sondern 10 - 0.1 und demnach noch /10 machen muß...
A Cray is the only computer that runs an endless loop in less than four hours.

hazumu-kun

BeitragMo, Dez 28, 2009 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, an der Division wirds hängen bleiben,
Ich mach grade mal en Benchmark, Edit kommt gleich.

EDIT:
OMG, folgender Benchmark Code:

BlitzBasic: [AUSKLAPPEN]

Local starttime
Local floattime
Local divtime

Local a#
Local b
Local i,j

Const cycles= 1000000

starttime= MilliSecs()
For i=1 To cycles
a#=10
For j= 1 To 10
a#= a#- 0.1
Next
Next
floattime= MilliSecs()-starttime

starttime= MilliSecs()
For i=1 To cycles
a#=10
b= a#*10
For j= 1 To 10
b= b- 1
Next
a#= b/10.0
Next
divtime= MilliSecs()-starttime

Print "Durchläufe: "+cycles
Print "Mit Float: "+floattime+"ms"
Print "Mit Int und Division/Multiplikation: "+divtime+"ms"
Input()


Ergibt folgende erstaunliche Ergebnisse:
10.000 cycles
Float: 2ms
Int mit Div/Mult: 0ms

50.000 cycles
Float: 8ms
Int: 4ms

1.000.000 cycles
Float: 152ms
Int: 71ms

FAZIT:
Mit Integer und Umwandlung geht es doppelt so schnell, obwohl dividiert wird.
UND die Genauigkeit ist so wie sie sein soll!

FireballFlame

BeitragDi, Dez 29, 2009 2:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Integer sind nunmal grundsätzlich schneller als Floats, da das Rechnen damit unkomplizierter ist.

Dafür, dass bei Floats und Doubles Fehler auftreten, kann übrigens BlitzMax nichts.
Der Computer speichert Zahlen intern binär, und deine 0.1 beispielsweise ergibt in binär eine Zahl mit unendlich vielen Nachkommastellen.
Daher muss der Computer bei jedem Rechenschritt runden und das Ergebnis wird dementsprechend ungenau Wink

Was genau dann am Ende herauskommt, hängt davon ab, wie du rechnest:
BlitzMax: [AUSKLAPPEN]

SuperStrict
Framework BRL.StandardIO
Private



Rechnung1
Rechnung2
Rechnung3
Rechnung4

Input ""
End








Function Rechnung1()
For Local i:Int=0 To 10
Print 10:Double-Double(i)
Next
Print
End Function

Function Rechnung2()
Local x:Double=10
Local y:Double=0.1:Double
Print x
Print x-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print x-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y-y
Print
End Function

Function Rechnung3()
For Local i:Int=0 To 10
Local x:Double=10
Local y:Double=0.1:Double
For Local j:Int=1 To i
x:-y+y+y+y+y+y+y+y+y+y
Next
Print x
Next
Print
End Function

Function Rechnung4()
For Local i:Int=0 To 10
Local x:Double=10
For Local j:Int=1 To 10*i
x:-0.1:Double
Next
Print x
Next
Print
End Function

Skabus

BeitragDi, Dez 29, 2009 13:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir is schon klar das BlitzMax nichts dafür kann, aber andere Compiler rechnen das Floatergebnis automatisch intern um und belässt es nicht bei dieser Floatingpoint-Arithmetik...

Ich wusste nur nicht, dass BMax das intern nicht macht und daher das Ergebnis ungenau wird^^


Aber zum Glück ist die Lösung mit Integer elegant und schnell Very Happy


MfG Ska
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat

aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit!
Ein SNES-RPG mit Handels- und Wirtschaftselemente.
Infos?Hier: http://www.blitzforum.de/worklogs/234/
Besucht meine Seite:
www.seelenfriedhof.de.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group