4 Byte ---> 1 Float
Übersicht

![]() |
Silver_KneeBetreff: 4 Byte ---> 1 Float |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
denke aber nicht dass das Real- time tauglich ist bei 30/40 aufrufen
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 |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
das hab ich gemacht damit eine leere Datei entsteht.
Code: [AUSKLAPPEN] file=writefile("c:\testfile.txt")
sieht zugegeben schöner aus.
Closefile file 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für meinen Sketchup Exporter musste ich auch extra einen "'WriteFloat" Befehl schreiben (scheiss Ruby ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Is bestimmt super langsam... ![]() |
||
http://bl4ckd0g.funpic.de |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group