написать программу вычисления двоичного представления числа

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

написать программу,использующую процедуру вычисления двоичного представления числа S=0+1/5^1+1/5^2+1/5^3+...+1/5^N (n=8,10,20)
в вычисленияхудерживать 200 двоичных цифр.вывести на печаит первые 100 двоичных цифр.для организации вывода символов двоичных цифр использовать сдвиги бит
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

И в чем проблема? Нахождение самого числа - простой цикл for. Дальше 100 раз делать сдвиг влево (shl) и смотреть младший бит целой части. Правда, в таком случае требование о 200 удерживаемых в памяти разрядах - ни к селу ни к городу. Ну удерживаются они, толку-то, если их никто не увидит?
Второй вариант - просто по правилам переводить число в двоичный формат и записывать в строку (множить на 2, смотреть младший бит целой части). Только в таком случае никак нельзя использовать побитовый сдвиг.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

не все так просто.дело в том что если просто сложить это число(получить сумму),то оно будет не точное(округлиться).в этом вся и загвоздка надо каким-нить образом запихать его в массив а от туда переводить!!!!!!!!!!а вот как?
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Ну я прямо даже не знаю...
Ну можно вычислить эту сумму, каждый раз беря в знаменателе не 1, а, например, 65536, а потом на 16 двоичных знаков сдвинуть запятую. Тогда точности хватит?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

не совсем понял .можешь код выложить?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Так ли я понял? Сумма S - есть 200 битовое число? Если так, то FPU хватит лишь на 80. Все махинации со сложением, делением и возведением в степень надо делать с 200 битовыми монстрами. Сложение и умножение (возведение в натуральную степень) - это просто, а вот с делением придеться повозиться.
Если все же я правильно понял, то могу выложить процедуры для работы с N-битовыми двоичными числами.
It's a long way to the top if you wanna rock'n'roll
john_1
Сообщения: 19
Зарегистрирован: 16 ноя 2006, 07:18

выложи,я посмотрю
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Как и обещал, выкладываю.

Первоначально есть форма, на ней:
3 едита - два для ввода чисел, один для результата
2 батона - умножить и разделить на 2.

Тип TBigBinNumber - по сути массив из байтов длиной в 200 бит. Организован так, что первые 8 бит - целая часть числа, остальные - дробная. Есть две основные функции - сложение и умножение. Числа беззнаковые, кому надо дорабатывайте сами.
С делением, как и говорил, надо повозиться - выложу чуть позже, работа знаете ли ... :-)
Есть еще функции:
- загрузки целого числа, потом добавлю дробные из Real или больше.
- выгрузки этого монстра в Real (или другой тип FP).
На ассемблере все гораздо компактней или красивей - не говоря уж о скорости, но за рамки раздела выходить не стал.
Пока все.

Код: Выделить всё

unit bbn;

interface

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

type

  TBigBinNumber = array [0..24] of byte;

  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    btnMul: TButton;
    Edit3: TEdit;
    btnDiv2: TButton;
    procedure btnMulClick(Sender: TObject);
    procedure btnDiv2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  b	   : TBigBinNumber;

implementation

{$R *.dfm}

Function _binLoad(p1:Byte):TBigBinNumber;
begin
Result[0] := p1;
FillChar(Result[1], 24, 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 _binGetAsReal(p1:TBigBinNumber):Real;
var divizor : Real;
	x, y	: Integer;
begin
Result := 0;
Divizor := 128;
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(_binGetAsReal(b), ffFixed, 10, 13);
end;

procedure TForm1.btnDiv2Click(Sender: TObject);
begin
b := _binDiv2(b);
Edit3.Text := FloatToStrF(_binGetAsReal(b), ffFixed, 10, 13);
end;

end.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Есть такая библиотечка, libeay32.dll в ней множество функций для работы с большими числами неограниченной длины. Писал я для неё в своё время обвязку на дельфи, если интересно, могу выложить.
С уважением, Lost Angel...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

LAngel, все это конечно, хорошо. Но я думаю, парню в институт надо. Не потащит же он туда библиотеку с готовым кодом. ;-)
It's a long way to the top if you wanna rock'n'roll
Закрыто