Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
660to664
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
660to664
660to664
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Open For Binary - Single Datentyp

Open For Binary - Single Datentyp
05.09.2005 15:45:21
Heiko
Hallo, Excelianer,
wenn ich per VBA mit der Anweisung "Open filename for binary as..." eine Binärdatei öffne und mit Hilfe einer Schleife immer 4 Byte in eine Variable einlesen will, bekomme ich stets nur die entsprechenden 4 ASCII-Zeichen als Resultat. Hinter den 4-Byte Blöcken verbergen sich jedoch Fließkommazahlen mit dem Datentyp Single (sind ja auch 32 Bit). Gibt es eine Möglichkeit bzw. Funktion, die jeweiligen 4-Byte Blöcke in Realzahlen (IEEE754) umzuwandeln bzw. anzuzeigen?
Vielen Dank im voraus,
Heiko

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Open For Binary - Single Datentyp
05.09.2005 16:21:00
Reinhard
Hi Heiko,
hilft dir das:

Option Explicit
Sub tt()
Dim z(3) As Byte, wert As Single
z(0) = 23
z(1) = 160
z(2) = 75
z(3) = 112
wert = CSng(z(0) & z(1) & z(2) & z(3))
MsgBox wert ' 2,316075E +9, k.A. ob das stimmt*g
End Sub

Gruß
Reinhard
nee, geht leider nicht - Typen unverträglich
05.09.2005 16:45:58
Heiko
Hi, Reinhard,
in meinem Fall bekomme ich "Typen unverträglich", wenn ich einen 4-Byte Block in Single umwandeln will.
Heiko
AW: nee, geht leider nicht - Typen unverträglich
05.09.2005 17:01:17
Nepumuk
Hallo Heiko,
was für Zeichen sind in den 4 Bytes und welche Zahl verbirgt sich dahinter?
Gruß
Nepumuk
Excel & VBA – Beispiele
Anzeige
AW: nee, geht leider nicht - Typen unverträglich
05.09.2005 17:09:57
Reinhard
Hi Heiko,
open ... as #1
While Not EOF(1)
zähl = zähl + 1
For n = 0 To 3
Input #1, zahl ' k.A. wie man binär einliest, ggfs anpassen
z(n) = CByte(zahl)
ReDim Preserve wert(zähl)
wert(zähl) = CSng(z(0) & z(1) & z(2) & z(3))
Next n
Wend

Gruß
Reinhard
AW: Open For Binary - Single Datentyp
05.09.2005 17:45:38
IngGi
Hallo Heiko,
ich glaube kaum, dass es dafür eine Excel-Funktion gibt. Vielleicht findest du auf irgendeiner Excelseite, z.B. hier in der Recherche, eine benutzerdifinierte Funktion dafür.
Ich hab mich aber auch nicht davon abhalten können, sowas mal zu versuchen. Da ich mich hier jedoch erstmalig mit dem Single-Datentyp beschäftigt habe, kann ich auch gewaltig daneben liegen.
Meine Funktion erwartet die vier eingelesenen Bytes in den String-Variablen Byte0 bis Byte3, wobei Byte0 das niederwertigste Byte darstellt (niederwertigste 8 Bit der Mantisse). Der entsprechende Singlewert wird dann in cSingle zurückgegeben.
Zum Testen fehlt mir leider Datenmaterial. Probiers mal aus und berichte bitte, ob's funktioniert.

Private Function cSingle(Byte0 As String, Byte1 As String, Byte2 As String, Byte3 As String) As Single
Dim mant As Long
Dim exp As Integer
Dim vorz As Byte
Dim i As Integer
If Asc(Byte2) > 127 Then Byte2 = Chr(Asc(Byte2) - 127)
mant = 1 + (Asc(Byte0) / 16777216) + (Asc(Byte1) / 65536) + (Asc(Byte2) / 256)
exp = Asc(Byte3)
If Asc(Byte3) > 127 Then exp = exp - 127
If Asc(Byte2) > 127 Then exp = exp + 1
exp = exp - 127
If exp > 1 Then
For i = 1 To exp
cSingle = mant * mant
Next 'i
ElseIf exp = 1 Then
cSingle = mant
Else
cSingle = 0
End If
If Asc(Byte3) > 127 Then cSingle = cSingle * (-1)
End Function
Gruß Ingolf
Anzeige
AW: Open For Binary - Single Datentyp
05.09.2005 18:41:40
IngGi
Hallo Heiko,
jetzt sind mir beim Auskommentieren gleich zwei Fehler aufgefallen. Ich habe vergessen, die 7 niederwertigsten Bits aus Byte3 für den Exponenten um 1 Bit nach links zu schieben. Und die Berechnung des Singlewertes aus Mantisse, Basis und Exponent war völliger Quatsch. Hier nochmal der berichtigte und jetzt auch auskommentierte Code.

Private Function cSingle(Byte0 As String, Byte1 As String, Byte2 As String, Byte3 As String) As Single
Dim mant As Long
Dim exp As Integer
Dim vorz As Byte
Dim i As Integer
'Single Datentyp nach IEEE754
'Bit 0 bis 22 = Nachkommateil der Mantisse, Vorkommateil = 1
'Bit 23 bis 30 = Exponent, Basis = 2
'bit 31 = Vorzeichenflag: 0=positiv  1=negativ
'Exponent versetzt dargestellt, d.h. tatsächlicher Exponent = dargestellter Exponent - 127
'Höchstwertigstes Bit von Byte2 = niederwertigstes Bit des Exponenten
'Daher wenn gesetzt, aus Byte2 und damit aus der Mantisse rausrechnen
If Asc(Byte2) > 127 Then Byte2 = Chr(Asc(Byte2) - 127)
'Die Mantisse ergibt sich damit aus dem Vorkommaanteil 1 plus
'Byte0 (Wertigkeit:1/16777216) + Byte1 (Wertigkeit:1/65536) + Byte2 (Wertigkeit:1/256),
'wobei das höchstwertige Bit von Byte2 ja schon rausgerechnet ist (gehört zum Exponenten)
mant = 1 + (Asc(Byte0) / 16777216) + (Asc(Byte1) / 65536) + (Asc(Byte2) / 256)
'Zur Berechnung des Exponenten zunächst das höchstwertige Bit von Byte3 rausrechnen,
'wenn gesetzt
If Asc(Byte3) > 127 Then Byte3 = Chr(Asc(Byte3) - 127)
'Den Wert von Byte3 jetzt um 1 Bit nach links rücken und an exp übergeben
exp = Asc(Byte3) * 2
'Das höchstwertige Bit von Byte3 ist das Vorzeichenflag und muß, wenn gesetzt,
'rausgerechnet werden
If Asc(Byte3) > 127 Then exp = exp - 127
'Das höchstwertige Bit von Byte2 ist das niederwertigste Bit des Exponenten
'und muss, wenn gesetzt, reingerechnet werden
If Asc(Byte2) > 127 Then exp = exp + 1
'Der Exponent ist laut IEEE754 versetzt dargestellt und muss daher um 127 verringert werden
exp = exp - 127
'Singlewert = Mantisse * Basis hoch Exponent
If exp > 1 Then
cSingle = 2 'Basis an cSingle übergeben
For i = 1 To exp
cSingle = cSingle * 2 'Basis entspr. dem Exponenten (exp-mal) mit sich selbst multiplizieren
Next 'i
cSingle = cSingle * mant 'und schließlich noch mit der Mantisse
ElseIf exp = 1 Then
cSingle = mant
Else
cSingle = 0
End If
'Wenn Vorzeichenflag gesetzt, Wert negieren
If Asc(Byte3) > 127 Then cSingle = cSingle * (-1)
End Function
Gruß Ingolf
Anzeige
AW: Open For Binary - Single Datentyp
06.09.2005 01:20:44
IngGi
Hallo Heiko,
ich hab nochmal 2 Fehler entdeckt. Langsam wird das hier zum Flickenteppich. Die Mantisse muss, wie der Exponent, ebenfalls um 1 Bit nach links verschoben werden, da die Funktion bezüglich der Mantisse mit 3 Bytes=24 Bit nach dem Komma rechnet, tatsächlich aber nur 23 Bit da sind und das höchstwertige Bit (1. Stelle nach dem Komma) in den Exponenten verschoben wird, wo es auch hingehört und durch ein Nullbit ersetzt wird. Die Linksverschiebung wird durch entsprechende Änderung der Wertigkeiten von Byte0 bis Byte3 erreicht. Hier der Codeschnipsel zum Ersetzen.
'Die Mantisse ergibt sich damit aus dem Vorkommaanteil 1 plus
'Byte0 (Wertigkeit:1/8388608) + Byte1 (Wertigkeit:1/32768) + Byte2 (Wertigkeit:1/128),
'wobei das höchstwertige Bit von Byte2 ja schon rausgerechnet ist (gehört zum Exponenten)
'Bei den Wertigkeiten ist bereits berücksichtigt, dass die Mantisse wegen der Überlappung
'der 32-Bit-Struktur in den 4 Bytes um 1 Bit nach links verschoben werden muss.
mant = 1 + (Asc(Byte0) / 8388608) + (Asc(Byte1) / 32768) + (Asc(Byte2) / 128)
Außerdem muss die Variable mant natürlich als Single deklariert werden.
Gruß Ingolf
Anzeige
AW: Open For Binary - Single Datentyp
06.09.2005 10:22:27
Heiko
Hallo, Ingolf,
vielen Dank für die ausführliche Antwort. Ich hatte gehofft, dass es nicht erforderlich sein würde, alle Bits einzeln auszulesen, Mantisse und Exponent festzulegen, um das ergebnis selbst zu berechnen (hätte ich nie hinbekommen). Da Du Dir die riesen Mühe gemacht hast, wäre es schade, wenn ich den Code nicht zum Laufen kriege- im Moment klappt der Funktionsaufruf noch nicht.
Die Funktion heißt "cSingle". Im letzten Teil des Codes wird aber cSingle wie eine Variable behandelt. Ich nehme an, dass dies schon richtig ist. Aber ich verstehe es noch nicht ganz. Ich habe nun versucht, aus einer Binärdatei jeweils 4 Byte einzulesen und mit "cSingle" den 4-Byte String in die entsprechende Realzahl umzuwandeln. Geht leider nicht- wahrscheinlich bin ich bereits hier auf dem falschen Weg. (S.u.)

Sub open_binary()
Dim text As String
Dim name As String
Dim value As Single
name = "c:\test.raw"
Open name For Binary As 1
While EOF(1) = False
text = Input(4, #1) '4 Bytes
value = cSingle(text)
Wend
Close 1
End Sub

Kannst Du mir nochmal helfen, wie ich die Funktion aufrufe und die 4-Byte zeichenkette tatsächlich mit Deiner Funktion umrechnen kann?
Ich habe mal die Datei angehängt (ist natürlich keine Excel-Datei, bitte in test.raw umbenennen und in C:\ ablegen)
https://www.herber.de/bbs/user/26318.xls
Vielen Dank für Deine Hilfe
Anzeige
AW: Open For Binary - Single Datentyp
06.09.2005 10:59:08
IngGi
Hallo Heiko,
eine Rückfrage zu deiner raw-Datei. Die Bytes sind so gruppiert, dass immer zwei Blanks von zwei anderen ASCII-Zeichen gefolgt werden. Bilden jetzt immer 2 Blanks + die 2 Zeichen eine 4-Byte-Gruppe oder muß man die Blanks aussen vor lassen, so dass immer 2 2er-Gruppen von Zeichen - getrennt durch jeweils 2 Blanks - eine 4-Byte-Gruppe bilden?
Und noch eine zweite Frage: Ist das erste Byte das höchstwertige oder das niedrigstwertige Byte?
Gruß Ingolf
AW: Open For Binary - Single Datentyp
06.09.2005 11:14:42
Heiko
Hallo, Ingolf,
die Leerzeichen gehören zur Zeichenfolge. Im Hexeditor sieht dann eine Folge etwa so aus: 00 00 85 42
00 00 4C 42
...
Wenn ich mich nicht irre, werden die Bytes von rechts nach links gelesen. Jedenfalls macht das auch der Hexeditor so. Die Zeichenfolge in Bits sieht dort dann so aus:
1000010 01011000 00000000 00000000
also gerage umgedreht.
Vielleicht hilft Dir das zur Kontrolle: Die erste Realzahl muss 54 lauten (Mantisse = 0.8437500 und Exp = 6), die zweite 51 (Mantisse = 0.7968750 und Exp = 6).
Die Binärdateien, die ich auslesen möchte enthalten tausende von Intensitätswerten aus einer analytischen Messung.
Vielen Dank für Deine Hilfe!
Anzeige
AW: Open For Binary - Single Datentyp
06.09.2005 11:51:36
IngGi
Hallo Heiko,
die Geschichte bleibt spannend. Laut Definition des Datentyps Single, die ich mir aus dem Internet heruntergeladen habe, werden Mantisse und Exponent zur Basis 2 standardisiert dargestellt, und zwar so, dass die Mantisse immer >= 1 und Na ja, hast du eine passende Definition für die bei dir verwendeten Daten für mich? Oder kannst du mir 10 Beispiele oder so mit Bitmuster, Mantisse, Exponent und Realzahl geben, anhand derer ich die gültige Definition vielleicht nachvollziehen kann? Das Ganze ist ne hübsche Tüftelei, die mir gar nicht schlecht gefällt.
Gruß Ingolf
AW: Open For Binary - Single Datentyp
06.09.2005 12:57:58
Heiko
Hallo, Ingolf,
Du hast recht, bei Wikipedia (http://de.wikipedia.org/wiki/IEEE_754) ist die Mantisse als 1 kleiner gleich m kleiner 2 definiert. In der Help meines Hex-Editors (mit dem ich auch die Werte für Mantisse und Exponent angezeigt bekomme) als 0.5 kleiner m kleiner gleich 1 (er benutzt scheinbar auch den Standard IEEE754). Komisch.
Ich könnte Dir einige Original Meßdateien im *.raw-Format (ehem. Siemens) und eine kopie der Dateistruktur, die vom Hersteller zur Verfügung gestellt wurde, zusenden. Den Inhalt habe ich mit der Shareware HexEdit 2.6 herausgefunden. Würde Dir das helfen? Die Dateistruktur muss ich allerdings einscannen.
Hier erstmal die Binärdateien: https://www.herber.de/bbs/user/26323.zip
Die Dateistruktur würde ich Dir lieber an Deine e-mail senden. Geht das?
Gruß, Heiko
Anzeige
AW: Open For Binary - Single Datentyp
06.09.2005 13:44:01
IngGi
Hallo Heiko,
die Wikipedia-Seite war schon mal aufschlussreich. Mit den dortigen Infos kann ich für die zwei Beispielzahlen, die ich von dir schon habe, Mantisse und Exponent, so wie sie sein müssen, ausrechnen. Das reicht mir dann erstmal zum Probieren. Zu der Sache mit dem versetzten Exponenten gibt die Seite aber leider auch keinen weiteren Aufschluss, bestätigt aber zumindest, dass man einfach 127 subtrahieren muss. Ich lass es daher erstmal so. Sobald ich mehr weiß, meld ich mich wieder.
Gruß Ingolf
AW: Open For Binary - Single Datentyp
06.09.2005 14:19:12
IngGi
Hallo Heiko,
das ging jetzt schneller, als gedacht. Es funktioniert bei mir. Ich musste noch ein paar kleine Änderungen vornehmen, aber jetzt hat er mir zumindest deine beiden Beispielzahlen korrekt bearbeitet, von der 32-Bitstruktur über Mantisse, Basis und Exponent bis hin zur Realzahl. Ich habe dir hier die Funktion und das aufrufende Makro nochmal eingestellt. Möglicherweise hapert es jetzt noch an deinen Realdaten. Die Dateien, die du mir beim letzten Mal hochgeladen hast, haben nämlich einen Vorlauf. Den müsste man eventuell noch umkurven. Gib mir dann nochmal Bescheid.

Private Function cSingle(Byte0 As String, Byte1 As String, Byte2 As String, Byte3 As String) As Single
Dim mant As Single
Dim exp As Integer
Dim vorz As Byte
Dim i As Integer
'Single Datentyp nach IEEE754
'Bit 0 bis 22 = Nachkommateil der Mantisse, Vorkommateil = 1
'Bit 23 bis 30 = Exponent, Basis = 2
'bit 31 = Vorzeichenflag: 0=positiv  1=negativ
'Exponent versetzt dargestellt, d.h. tatsächlicher Exponent = dargestellter Exponent - 127
'Höchstwertigstes Bit von Byte2 = niederwertigstes Bit des Exponenten
'Daher wenn gesetzt, aus Byte2 und damit aus der Mantisse rausrechnen
If Asc(Byte2) > 127 Then Byte2 = Chr(Asc(Byte2) - 127)
'Die Mantisse ergibt sich damit aus dem Vorkommaanteil 1 plus
'Byte0 (Wertigkeit:1/8388608) + Byte1 (Wertigkeit:1/32768) + Byte2 (Wertigkeit:1/128),
'wobei das höchstwertige Bit von Byte2 ja schon rausgerechnet ist (gehört zum Exponenten)
'Bei den Wertigkeiten ist bereits berücksichtigt, dass die Mantisse wegen der Überlappung
'der 32-Bit-Struktur in den 4 Bytes um 1 Bit nach links verschoben werden muss.
mant = 1 + (Asc(Byte0) / 8388608) + (Asc(Byte1) / 32768) + (Asc(Byte2) / 128)
'Zur Berechnung des Exponenten zunächst das höchstwertige Bit von Byte3 rausrechnen,
'wenn gesetzt
If Asc(Byte3) > 127 Then Byte3 = Chr(Asc(Byte3) - 127)
'Den Wert von Byte3 jetzt um 1 Bit nach links rücken und an exp übergeben
exp = Asc(Byte3) * 2
'Das höchstwertige Bit von Byte3 ist das Vorzeichenflag und muß, wenn gesetzt,
'rausgerechnet werden
If Asc(Byte3) > 127 Then exp = exp - 127
'Das höchstwertige Bit von Byte2 ist das niederwertigste Bit des Exponenten
'und muss, wenn gesetzt, reingerechnet werden
If Asc(Byte2) > 127 Then exp = exp + 1
'Der Exponent ist laut IEEE754 versetzt dargestellt und muss daher um 127 verringert werden
exp = exp - 127
'Singlewert = Mantisse * Basis hoch Exponent
If exp > 1 Then
cSingle = 2 'Basis an cSingle übergeben
For i = 1 To exp - 1
cSingle = cSingle * 2 'Basis entspr. dem Exponenten (exp-mal) mit sich selbst multiplizieren
Next 'i
cSingle = cSingle * mant 'und schließlich noch mit der Mantisse
ElseIf exp = 1 Then
cSingle = mant
Else
cSingle = 0
End If
'Wenn Vorzeichenflag gesetzt, Wert negieren
If Asc(Byte3) > 127 Then cSingle = cSingle * (-1)
End Function
Sub open_binary()
Dim B0 As String
Dim B1 As String
Dim B2 As String
Dim B3 As String
Dim name As String
Dim value As Single
Dim ff As Byte
ff = FreeFile
name = "c:\test.raw"
Open name For Binary As #ff
While Not EOF(1)
B0 = Input(1, #ff)
B1 = Input(1, #ff)
B2 = Input(1, #ff)
B3 = Input(1, #ff)
value = cSingle(B0, B1, B2, B3)
Wend
Close #ff
End Sub
Gruß Ingolf
Anzeige
AW: Open For Binary - Single Datentyp
06.09.2005 15:28:24
Heiko
Hallo, Ingolf,
super! Es klappt! Vielen Dank!
Du hast jedoch recht: Die Werte für Mantisse und Exponent, die mir mein HexEditor ausgespuckt hat, entsprechen eher "normierten" bzw. "denormalisierten" Werten. Die Bit-Reihenfolge stimmt allerdings. Und wenn ich die in einer Excel-Tabelle nach der IEEE Vorschrift berechne, erhalte ich nun die gleichen Werte wie die, welche Dein Makro ausspuckt, also "normalisierte". Das ergebnis ist seltsamerweise im Hex-Editor das gleiche, nämlich 54 für die ersten 4 Byte in der test-Datei.
Die Original-Dateien enthalten tatsächlich einen Header mit Geschwafel. Darin sind Angaben über Zeit, Datum und Messbedingungen enthalten- und das in unterschiedlichen Datenformaten. Teils Integer, teils als Realzahlen, teils als Text. Wenns Dich interessiert, kann ich Dir die Aufschlüsselung zumailen. Die Zahlenreihe beginnt erst ab byte Nr. 316. Allerdings geht die Aufschlüsselung nich genauer auf den IEEE Standard ein. Sie lautet nur: "Address 316+x; Code nR4 (=Realzahlen), Content: Raw Data, counts, 4 bytes, step.
Die Header-Umfahrung nehme ich morgen in Angriff.
Bis dahin vielleicht und nochmals vielen Dank!
Gruß, Heiko
Anzeige
Fehler in Mantisse?
07.09.2005 16:25:48
Heiko
Hallo, Ingolf,
es gibt doch noch ein (kleines) Problem:
Einen Fehler habe ich bereits entdeck, das reicht aber leider noch nicht:
Wenn das höchste Bit von Byte 2 (=niedrigstes von Byte 1) größer als 127 ist, so subtrahierst Du im Code 127. Falls also Byte 2 größer 127, dann ist es mind. 128. Davon 127 abgezogen ergibt 1. Dies wiederum würde bedeuten, dass aus dem Binärcode 10000000 - 00000001 werden würde. Da das niederwertigste Bit von Byte 1 allerdings 0 bleiben muss (das höchstwertige wird ja nur abgehackt), muss man doch 128 abziehen, richtig?
Dennoch kommt als Ergebnis für genau die Fälle, wo Byte 2 größer 127, genau die Hälfte des zu erwartenden Wertes heraus (ohne meine Korretur wars Hälfte +0.25).
Irgendwie klappt für genau diesen Fall die Verschiebung des Exponenten noch nicht ganz- ich komme aber nicht dahinter.
Vielleicht kannst Du nochmal reinsehen.
Gruß, Heiko
AW: Fehler in Mantisse?
08.09.2005 12:14:33
IngGi
Hallo Heiko,
du hast recht, man muss natürlich 128, nicht 127 abziehen. Ich hab das in der Funktion korrigiert. Der Fehler mit den halbierten Werten steckt in der Berechnung des Exponenten. Bit 0 bis 6 von Byte2 gehören ja zur Mantisse, Bit 7 dagegen ist das niedrigstwertige Bit des Exponenten. Da ich bei der Berechnung der Mantisse das Byte2 zunächst komplett mitrechne, müsste ich Bit 7 anschließend wieder rausrechnen. Um das zu umgehen, habe ich Bit 7 in Byte2 vor der Berechnung der Mantisse gelöscht, und dabei nicht bedacht, dass ich dieses Bit natürlich später nochmal zur Berechnung des Exponenten brauche. Daher war der Exponent bei gesetztem Bit 7 in Byte2 immer um 1 zu niedrig, was bei einer Basis von 2 zu einer Halbierung des Endwertes führt. Ich hab diesen Fehler jetzt dadurch korrigiert, das ich Bit 7 beim Löschen aus Byte 2 gleichzeitig in die Variable exp übernehme. Hier nochmal die gesamte Funktion.

Private Function cSingle(Byte0 As String, Byte1 As String, Byte2 As String, Byte3 As String) As Single
Dim mant As Single
Dim exp As Integer
Dim vorz As Byte
Dim i As Integer
'Single Datentyp nach IEEE754
'Bit 0 bis 22 = Nachkommateil der Mantisse, Vorkommateil = 1
'Bit 23 bis 30 = Exponent, Basis = 2
'bit 31 = Vorzeichenflag: 0=positiv  1=negativ
'Exponent versetzt dargestellt, d.h. tatsächlicher Exponent = dargestellter Exponent - 127
'Höchstwertigstes Bit von Byte2 = niederwertigstes Bit des Exponenten
'Daher wenn gesetzt, aus Byte2 und damit aus der Mantisse rausrechnen
'und gleichzeitig in den Exponenten reinrechnen
If Asc(Byte2) > 127 Then
Byte2 = Chr(Asc(Byte2) - 128)
exp = 1
End If
'Die Mantisse ergibt sich damit aus dem Vorkommaanteil 1 plus
'Byte0 (Wertigkeit:1/8388608) + Byte1 (Wertigkeit:1/32768) + Byte2 (Wertigkeit:1/128),
'wobei das höchstwertige Bit von Byte2 ja schon rausgerechnet ist (gehört zum Exponenten)
'Bei den Wertigkeiten ist bereits berücksichtigt, dass die Mantisse wegen der Überlappung
'der 32-Bit-Struktur in den 4 Bytes um 1 Bit nach links verschoben werden muss.
mant = 1 + (Asc(Byte0) / 8388608) + (Asc(Byte1) / 32768) + (Asc(Byte2) / 128)
'Zur Berechnung des Exponenten zunächst das höchstwertige Bit von Byte3 rausrechnen,
'wenn gesetzt
If Asc(Byte3) > 127 Then Byte3 = Chr(Asc(Byte3) - 127)
'Den Wert von Byte3 jetzt um 1 Bit nach links rücken und diesen Wert in exp addieren
exp = exp + Asc(Byte3) * 2
'Das höchstwertige Bit von Byte3 ist das Vorzeichenflag und muß, wenn gesetzt,
'rausgerechnet werden
If Asc(Byte3) > 127 Then exp = exp - 128
'Der Exponent ist laut IEEE754 versetzt dargestellt und muss daher um 127 verringert werden
exp = exp - 127
'Singlewert = Mantisse * Basis hoch Exponent
If exp > 1 Then
cSingle = 2 'Basis an cSingle übergeben
For i = 1 To exp - 1
cSingle = cSingle * 2 'Basis entspr. dem Exponenten (exp-mal) mit sich selbst multiplizieren
Next 'i
cSingle = cSingle * mant 'und schließlich noch mit der Mantisse
ElseIf exp = 1 Then
cSingle = mant
Else
cSingle = 0
End If
'Wenn Vorzeichenflag gesetzt, Wert negieren
If Asc(Byte3) > 127 Then cSingle = cSingle * (-1)
End Function
Gruß Ingolf

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige