Zitat von
Mr. G:
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.
Manchmal hilft es auch wenn man sich anschaut wie die Werte im Speicher abgelegt werden.
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:
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 Edit1 gibst Du einen Singel Wert ein z.B. 1,5 und drückst auf den Button
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.