Rechenungenauigkeit bei Integer?
Übersicht BlitzMax, BlitzMax NG Allgemein
SebeBetreff: Rechenungenauigkeit bei Integer? |
Mi, Feb 16, 2005 14:04 Antworten mit Zitat |
|
---|---|---|
Hi Leute,
gestern wollte ich ne Doku zu meinem NumSys Modul schreiben, dazu gehört ja auch ein nettes Beispiel. Beim Ausführen habe ich dann folgenden Fehler bemerkt: Bei der Funktion, die binäre in dezimale Zahlen umrechnet (b2d genannt) trat der Fehler auf, dass ab dem binären zahlenwert 1000 die dezimalen Zahlen um 1 zu niedrig waren, d.h. 111 war noch - richtigerweise - 7. 1000 komischerweise auch, 1001 war 8 etc. Wenn ich allerdings normal 2 ^ 3 berechnen lasse kommt wunderbar 8 heraus. Nachdem ich alle betroffenen Funktionen (oktal zu dezimal und hexadezimal zu dezimal) auf Float umgestellt habe wurde richtig gerechnet. Jetzt meine Frage: Was ist da los? Rechnet BlitzMax so ungenau mit Integerwerten? |
||
Dreamora |
Mi, Feb 16, 2005 15:17 Antworten mit Zitat |
|
---|---|---|
Eigentlich nicht, da sonst jedes gcc Programm falsch rechnen würde.
Würde eher vermuten, dass du einen fehler im Detail hast im Code der diesen Fehler erzeugt. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Sebe |
Mi, Feb 16, 2005 16:52 Antworten mit Zitat |
|
---|---|---|
Code: [AUSKLAPPEN] Function b2d:Int(binaryvalue:String) Local a:Int = 0 Local decimalvalue:Int = 0 For a = 1 To Len(binaryvalue) decimalvalue:+ Mid(binaryvalue, Len(binaryvalue) - a + 1, 1).toint() * (2 ^ (a - 1)) Next Return decimalvalue EndFunction So funktioniert es nicht. Code: [AUSKLAPPEN] Function b2d:Float(binaryvalue:String) Local a:Float = 0.0 Local decimalvalue:Float = 0.0 For a = 1.0 To Len(binaryvalue) decimalvalue:+ Mid(binaryvalue, Len(binaryvalue) - a + 1.0, 1).toint() * (2.0 ^ (a - 1)) Next Return decimalvalue EndFunction So funktioniert es schon... Wo liegt mein Fehler? |
||
Dreamora |
Mi, Feb 16, 2005 18:01 Antworten mit Zitat |
|
---|---|---|
I hab das Problem.
Ich ralle es zwar net wirklich, aber es scheint so als ob 2^a mit a = 3 7.9999999999 gibt ... und BM schneidet bei der int-konvertierung die stellen hinten einfach ab. 2^3 hingegen gibt 8 wie du schon geschrieben hast ... das heisst das a nicht ganz genau 3 ist sondern eher sowas wie 2.99999999999 Sprich er rechnet mit den Zahlen auf Double und bei der rückkonvertierung bockt er wohl ein wenig. ich vermute das ist ein Bug der erst mit 1.02 / 1.03 reingekommen ist, als die Math Lib modifiziert wurde, damit nicht immer alles mit Double gerechnet wird wenn Floats genutzt werden ... Deshalb funzt auch float, da er dort ja seine eigene Float Mathe hat. folgendes geht: Code: [AUSKLAPPEN] Function b2d:Int(binaryvalue:String)
Local a:Int Local decimalvalue:Int For a = 0 To Int(Len(binaryvalue) - 1) decimalvalue = decimalvalue + Ceil( Mid(binaryvalue, Len(binaryvalue) - a, 1).toint() * 2^a) Next Return decimalvalue EndFunction |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Sebe |
Mi, Feb 16, 2005 20:22 Antworten mit Zitat |
|
---|---|---|
Ich hab's mit der Beta Version 1.01 ausprobiert: selber Fehler. Und wenn er beim verwenden von Integer tatsächlich intern mit Double rechnet verwende ich lieber gleich nur noch Float (meine gehört zu haben, dass Double Berechnungen langsamer sind. Habe aber keine Ahnung mehr, warum...). | ||
Demon |
Mi, Feb 16, 2005 20:38 Antworten mit Zitat |
|
---|---|---|
Double ist langsamer, weil zwei Prozessorzyklen pro Operation gebraucht werden auf normalen 32-Bit Prozessoren (bei den neuen 64 Bit ist das nur ein Zyklus).
Ansonsten sind die Prozessoren dermaßen auf Float optimiert heutzutage, dass es praktisch keinen Unterschied mehr macht, ob du in Integer oder Float rechnest, obwohl Float theoretisch natürlich 'schwerer' zu handhaben ist. |
||
Don't drink and derive! |
TheShadowModerator |
Do, Feb 17, 2005 20:01 Antworten mit Zitat |
|
---|---|---|
^ ist ein fließkomma-operator... darum sollte man es für sowas nicht verwenden...
value=(1 SHL shift) shift 0=1 1=2 2=4 3=8 4=16 ... |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
Übersicht BlitzMax, BlitzMax NG Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group