4 Byte ---> 1 Float

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Silver_Knee

Betreff: 4 Byte ---> 1 Float

BeitragDi, Aug 07, 2007 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ich suche einen Weg um aus 4 Byte eine Float zu machen. laut forensuche hatte das Problem bisher keiner. laut Google 1000000de C++ user die das irgendwie mit BitConvert.Float(); oder so lösten da das mir nich wirklich weiterrhilft frage ich hier mal nach.

BladeRunner

Moderator

BeitragDi, Aug 07, 2007 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die 4 byte nacheinander im Speicher / Datei stehen:
ql:Readfloat
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

simi

BeitragDi, Aug 07, 2007 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte das Problem auch schon, allerdings scheint dieser Thread zu alt geworden zu sein, und deshalb aus Smalltalk gelöscht worden zu sein....

Eigentlich ist ein Float ziemlich einfach aufgebaut: aus Vorzeichen, Exponent und Mantisse....

Auf die Schnelle habe ich das hier bei Wikipedia gefunden:
-> http://de.wikipedia.org/wiki/G...mmazahl.29

BtbN

BeitragDi, Aug 07, 2007 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
In BB: Nimm ne Bank, pack die 4 Bytes rein, und lies nen Float raus.
BMax selbe vorgehensweise, aber auch ohne Banks möglich.

Silver_Knee

BeitragDi, Aug 07, 2007 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
erstmal 1000 dank
ich arbeite mal an ner func die das umrechnet.
Bisher hatte ich den BladeRunner-Vorschlag genommen. aber nun will ich verschiedene Daten aus meinem stream in ne bank zwischenspeichern und solange es keinen

stream=MakeStreamFromBank(bank)

befehl gibt muss wohl das bitweise auseinandernehmen aushelfen.

EDIT:
@btbnl
Code: [AUSKLAPPEN]
bank=CreateBank(4)
byte=ReadFloat(bank)

So?? probiers mal selbst aus
ansonsten .... hmmm ich glaube ich hab gerade ne idee ich meldemich gleich wieder

EDIT2:
Code: [AUSKLAPPEN]
CloseFile WriteFile("c:\testfile.txt");sicherstellen dass da
file=OpenFile("c:\testfile.txt");writefile geht nicht readfile erst recht nicht.
WriteByte file,123
WriteByte file,0
WriteByte file,0
WriteByte file,0

SeekFile file,0

Print ReadInt(file)
Closefile file
denke aber nicht dass das Real- time tauglich ist bei 30/40 aufrufen

D2006

Administrator

BeitragDi, Aug 07, 2007 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ql:PokeByte
ql:PeekFloat
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Silver_Knee

BeitragDi, Aug 07, 2007 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie komme ich eigendlich zur annahme dass es diese befehle nicht gibt... ohhh man *hand-auf-stirn-klatsch*
nunja die funktion ist überflüssig aber trotzdem warum geht sie nicht:
Code: [AUSKLAPPEN]
CloseFile WriteFile("c:\testfile.txt");sicherstellen dass da
file=OpenFile("c:\testfile.txt");writefile geht nicht readfile erst recht nicht.
WriteFloat file,7.5

SeekFile file,0

Print ReadFloat(file)

SeekFile file,0

Print Byte2Float(ReadByte(file),ReadByte(file),ReadByte(file),ReadByte(file))
CloseFile file

Function Byte2Float#(byte1,byte2,byte3,byte4)
   ;Nach einer Formel aus Wikipedia: http://de.wikipedia.org/wiki/Gleitkommazahl#Berechnung_einer_IEEE_single_precision_Gleitkommazahl_.2832-Bit-Gleitkommazahl.29
   ;By FTC / Silver_Knee www.Fs-COM.com
   
   vz=%1 And (byte1 Shr 7);8. bit von rechts entscheidet ;nur 1 bit gültig
   e=$000000FF And ((byte1 Shl 1) Or (byte2 Shl 7) );1. byte um 1bit erhöhen und 8.bit des 2.bytes hintanhängen;auf ein Byte begrenzen
   m#=byte4+(byte3 Shl 8)+((byte2) Shl 16);byte4 normal; byte3 um 8bit erhöht;byte2 um 16bit erhöht und auf die erechten 7 bit begrenzt
   
   Stop
   ;ich verwende nicht ^ da das durch den blitz-algo etwas langsam ist. 2^52 ist konstant ich denke deswegen wird das programm nicht verangsamt
   Return  (vz=0)-(vz=1)*(1.0+m/2.0^52)*2^(e-127)
End Function

Blitzcoder

Newsposter

BeitragDi, Aug 07, 2007 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum es nicht geht, kann ich dir jetzt nicht sagen, aber die erste Zeile ist ja grausig:

Code: [AUSKLAPPEN]
CloseFile WriteFile("c:\testfile.txt");sicherstellen dass da


Dafür gibts bessere Wege, z.B. FileType. Ist zwar Offtopic, aber ich finde es trotzdem wichtig Wink

Im übrigen ist deine Methode fürchte ich sowieso langsamer als der einfache Weg über Banks.

MfG
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

Silver_Knee

BeitragDi, Aug 07, 2007 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
das hab ich gemacht damit eine leere Datei entsteht.
Code: [AUSKLAPPEN]
file=writefile("c:\testfile.txt")
Closefile file
sieht zugegeben schöner aus.
Zitat:
;sicherstellen dass da
nun gut besser wäre
Zitat:
;sicherstellen dass da und leer
^^

und klar ist das 1000000000 mal lahmer weils über die Festplatte läuft

Willi die Rübe

BeitragMi, Aug 08, 2007 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Für meinen Sketchup Exporter musste ich auch extra einen "'WriteFloat" Befehl schreiben (scheiss Ruby Laughing ), alles nach IEEE Standart. Hab allerdings den Ansatz in BB gemacht, vllt. kannst du was damit anfangen:

Code: [AUSKLAPPEN]

zahl#=11.511

Print "Zahl: "+zahl#

WriteFloat(zahl#)

WaitKey()


Function WriteFloat(z#)

   Local bit
   Local t1$,t2$
   
   If z#>0 Then bit=0
   If z#<0 Then bit=1
   
   Exponent%=log2(z)+127
   mantisse%=((z#/(2^FLOOR(Log2(z)))) -1)*2^23
   
   t1$=ToBin$(Exponent%)
   t2$=ToBin$(mantisse%)

      For a=1 To 23-Len(t2)
         t2="0"+t2
      Next
      
      Fl$= bit+t1$+t2$
      
   
      Print Fl$
      
      Print "1: "+Mid(Fl$,1,8)
      Print "2: "+Mid(Fl$,9,8)
      Print "3: "+Mid(Fl$,17,8)
      Print "4: "+Mid(Fl$,24,8)
      
      Print "Byte 1: "+BitToByte(Mid(Fl$,1,8))
      Print "Byte 2: "+BitToByte(Mid(Fl$,9,8))
      Print "Byte 3: "+BitToByte(Mid(Fl$,17,8))
      Print "Byte 4: "+BitToByte(Mid(Fl$,24,8))
      
      Return Fl$
   
End Function

Function Log2#(x#)
   epsilon#=1.0/(10^12)
   Integer_value=0
   While(X#<1)
      integer_value = integer_value - 1
    X# = X# * 2
   Wend
   While(X#>=2)
      integer_value = integer_value + 1
      X# = X# / 2
   Wend
      decfrac# = 0.0
      partial# = 0.5
      X#=X#*X#

   While(partial > epsilon)
    if X >= 2:
      decfrac# = decfrac# + partial#
      X# = X# / 2
      EndIf
    partial# = partial# / 2
    X#=X#*X#
   Wend
  return (integer_value + decfrac#)   
End Function

Function ToBin$(z%)
   Local val$
   Repeat

      val$=(z Mod(2))+val$
      z=floor(z/2)

      If z=1 Then val$="1"+val$ : Exit
      If z=0 Then Exit
            
   Forever
   
   Return val$
End Function

Function BitToByte(t$)
   Local bit[7]
      For a=0 To 7
         bit[a]=int(mid(t$, a+1,1))
      Next
      byte=bit[0]*128+bit[1]*64+bit[2]*32+bit[3]*16+bit[4]*8+bit[5]*4+bit[6]*2+bit[7]*1
   
      Return byte
End Function


Also wenn die langweilig ist, kannst du die Funktion einfach mal umdrehen.
Ich habe keine Lösung, aber ich bewundere das Problem.
Tehadon
Q6600, MSI Neo2-FR, 4GB Ram, nVidia 7800 GTX

At the Farewell Party visit: MySpace | Homepage
  • Zuletzt bearbeitet von Willi die Rübe am Fr, Mai 23, 2008 15:40, insgesamt einmal bearbeitet
 

David

BeitragMi, Aug 08, 2007 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Is bestimmt super langsam... Shocked
http://bl4ckd0g.funpic.de

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group