![]() |
4-Byte-Single
Wie lang ist die Mantisse bei einem 4 Byte-Single ?
23 Bit-Länge möchte ich eigentlich ausschließen, da ich dann beispielsweise bei der Dezimalzahl 0,6 einen Wert von 0,599999... herausbekomme, Delphi mir aber einen Wert über 0,6 liefert. Bin dankbar für jede Antwort. |
Re: 4-Byte-Single
23 ist schon richtig
aber es gibt ne rundung bei der letzten mantissenstelle |
Re: 4-Byte-Single
Wichtig: das ist eine Binär-Mantisse, 23 Bits. Das entspricht 23*log(2)/log(10) Dezimalstellen, also ~6,92.
Es gibt endliche Dezimalbrüche (z.B. 0,6), die man nicht als endliche Binärbrüche schreiben kann -> daher die 0,599999. Es hilft nur, wenn du Dezimal auf eine feste Stelle vorher rundest, also z.B. auf 5 Stellen (nicht Nachkommastellen sondern signifikante Stellen!). |
Re: 4-Byte-Single
Zitat:
Mach mal ein Neues Projekt, mit drei TEdit Feldern (Edit1, Edit2, Edit3) und einem TButton. Auf den Button legst Du nun folgenden Quelltext:
Delphi-Quellcode:
In Edit1 gibst Du einen Singel Wert ein z.B. 1,5 und drückst auf den Button
procedure TForm1.Button1Click(Sender: TObject);
var x : record case Boolean of True: (s: Single); // hier kann natürlich auch ein ander Typ stehen False: (b: array[0..3] of Byte); // das Array sollte so groß sein wie der Typ (hier 4 byte) end; s, s2: string; i: Integer; const Hex2BinA : Array['0'..'9'] of string = ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001'); hex2BinB : Array['A'..'F'] of String = ('1010', '1011', '1100', '1101', '1110', '1111'); begin x.s := StrToFloat(Edit1.Text); // In Edit1 steckt der eingegebene reelle Wert s := ''; for i := 0 to 3 do s := s + IntToHex(x.b[i],2); Edit2.Text := s; // In Edit2 wird der hexadezimale Wert ausgegeben for i := 1 to length(s) do begin if s[i] in ['0'..'9'] then s2 := s2 + hex2binA[s[i]] else s2 := s2 + hex2binB[s[i]]; if i mod 2 = 0 then s2 := s2 + ' '; end; Edit3.Text := s2; // In Edit2 wird der binäre Wert ausgegeben end; In Edit 2 siehst Du in hexadezimaler Form wie es abgelegt ist In Edit 3 siehst Du es in binärer Form (Leerzeichen zw. den bytes) Anmerkung: Ich weiß, Int2Bin kann man auch eleganter lösen. Die Methode ist nur mal eben schnell (quick and dirty) geschrieben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz