unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button3: TButton;
    LabeledEdit3: TLabeledEdit;
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 //funkcja zamienia liczbę calkowita na liczbe binarna
//o okreslonej parametrem k liczbie cyfr
function IntToBinF(x:integer;k:integer):string;
var s:string;
begin
  s:='';
  repeat
     if x mod 2=0 then s:='0'+s else s:='1'+s;
     x:=x div 2;
     k:=k-1;
     if (x>0)and (k=0) then k:=k+1; {1}
  until k=0;
  Result:=s;
end;
//zamiana liczby binarnej na integer
function BinToInt(s:string):longint;
var pom,i,z:integer;
begin
  pom:=1; Result:=0;
  for i:=Length(s) downto 1 do
  begin
    if s[i]='1' then z:=1 else z:=0;
    Result:=Result+z*pom;
    pom:=pom*2;
  end;
end;

//zamiana liczby binarnej (ulamkowej) na liczbę rzeczywistą
function BinToIntU(s:string):single;
var pom,i,z:integer;
begin
  pom:=2; Result:=0;
  for i:=1 to Length(s) do
  begin
    if s[i]='1' then z:=1 else z:=0;
    Result:=Result+z/pom;
    pom:=pom*2;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var s: TMemoryStream;
    zm: single;
    buf: array[0..3] of byte;
    liczba_bin,cecha,mantysa,znak:string;
begin
  zm:=StrToFloat(LabeledEdit3.Text);     //interpretacja (-1)^znak*1.m*2^(c-127)
  s:=TMemoryStream.Create;
  s.Write(zm,SizeOf(zm));
  s.Position:=0;
  s.Read(buf,SizeOf(buf));
  liczba_bin:= InttoBinF(buf[3],8)+InttoBinF(buf[2],8)+
               InttoBinF(buf[1],8)+InttoBinF(buf[0],8);
  znak:=copy(liczba_bin,1,1);
  cecha:=copy(liczba_bin,2,8);
  mantysa:= copy(liczba_bin,10,23);
  Label1.Caption:=znak+' '+cecha+' '+mantysa;
  Label4.Caption:='wartość liczby='+'(-1)^'+znak+' * '+FloattoStr(BinToIntU(mantysa)+1)+
                  ' * 2^('+InttoStr(BinToInt(cecha))+'-127)='+FloatToStr(zm);
  S.Free;
end;

end.
