Rechenungenauigkeit bei Integer?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Sebe

Betreff: Rechenungenauigkeit bei Integer?

BeitragMi, Feb 16, 2005 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 16, 2005 15:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 16, 2005 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 16, 2005 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 16, 2005 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Feb 16, 2005 20:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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!

TheShadow

Moderator

BeitragDo, Feb 17, 2005 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
^ 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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group