Re: написать программу
Добавлено: 27 ноя 2006, 16:33
Прошу не винить за малофункциональность, но для решения именно этой задачи сгодиться. Формат числа немного изменился, теперь целая часть - 4 байта, остальные - дробная:
Код: Выделить всё
unit bbn;
interface
uses
Windows, SysUtils, Classes, Controls, Forms, StdCtrls;
type
TBigBinNumber = array [0..24] of byte;
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
btnMul: TButton;
Edit3: TEdit;
btnDiv2: TButton;
btnDiv: TButton;
procedure btnMulClick(Sender: TObject);
procedure btnDiv2Click(Sender: TObject);
procedure btnDivClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
b : TBigBinNumber;
implementation
{$R *.dfm}
Function _binLoad(p1 :D WORD):TBigBinNumber;
begin
Result[0] := (p1 shr 24);
Result[1] := (p1 shr 16) and $FF;
Result[2] := (p1 shr 8) and $FF;
Result[3] := p1 and $FF;
FillChar(Result[4], 21, 0);
end;
function _binAdd(p1,p2:TBigBinNumber):TBigBinNumber;
var x, w: word;
begin
W := 0;
for x:=24 downto 0 do
begin
W := P1[X]+P2[X] + w shr 8;
Result[X] := byte(W);
end;
end;
function _binMul(p1,p2:TBigBinNumber):TBigBinNumber;
var x, y, w : Word;
tmp : TBigBinNumber;
begin
Result := _binLoad(0);
For x:=24 downto 0 do
begin
w := 0;
For y:=24 downto 0 do
begin
w := p1[x]*p2[y] + w shr 8;
tmp[y] := byte(w);
end;
Result := _binAdd(Result, tmp);
end;
end;
Function _binDiv2(p1:TBigBinNumber):TBigBinNumber;
var x : Integer;
oldcf, cf: Byte;
begin
oldcf := 0;
cf := 0;
For x:=0 to 24 do
begin
cf := p1[x] and 1;
Result[x] := (p1[x] shr 1) or (oldcf shl 7);
oldcf := cf;
end;
end;
Function _binIDiv(p1:TBigBinNumber;p2:Byte):TBigBinNumber;
Var X :Integer;
T :Word;
begin
T := 0;
For X:=0 to 24 do
begin
Result[X]:=(T+p1[x]) div p2;
T := ((T+p1[x]) mod p2) shl 8;
end;
end;
Function _binGetAsDouble(p1:TBigBinNumber) :D ouble;
var divizor : Double;
x, y : Integer;
begin
Result := 0;
Divizor := 65536;
Divizor := Divizor * 32768;
For X:=0 to 24 do
for Y:=7 downto 0 do
begin
Result := Result + ((p1[X] shr Y) and 1) * divizor;
divizor := divizor / 2;
end;
end;
procedure TForm1.btnMulClick(Sender: TObject);
var p1,p2 : Integer;
begin
p1 := StrToInt(Edit1.Text);
p2 := StrToInt(Edit2.Text);
b := _binMul(_binLoad(p1), _binLoad(p2));
Edit3.Text := FloatToStrF(_binGetAsDouble(b), ffFixed, 10, 13);
end;
procedure TForm1.btnDiv2Click(Sender: TObject);
begin
b := _binDiv2(b);
Edit3.Text := FloatToStrF(_binGetAsDouble(b), ffFixed, 10, 13);
end;
procedure TForm1.btnDivClick(Sender: TObject);
begin
b := _binIDiv(_binLoad(StrToInt(Edit1.Text)), StrToInt(Edit2.Text));
Edit3.Text := FloatToStrF(_binGetAsDouble(b), ffFixed, 13, 13);
end;
end.