Thema: Delphi 4-Byte-Single

Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: 4-Byte-Single

  Alt 15. Jul 2005, 14:02
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.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat