4 Byte ---> 1 Float
Übersicht
Sonstiges
Smalltalk|
|
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
Sonstiges
Smalltalk
Powered by phpBB © 2001 - 2006, phpBB Group
