Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с числами целого типа с более чем 60 значащими разрядами. [D6]


ProgOnDel ©   (2002-10-22 13:54:00) 

В работе возникла необходимость работы с числами целочисельного типа данных содержащими более 60 разрядов. Причём необходима точность выполняемых вычислений до единичного разряда. Ни один стандартный целочисельный тип данных в Делфи на это не способен. Один из возможных путей решения - создание своего типа с нужным мне (в пределах возможного для Харда) максимальным значением и свойствами общими с другими целочисельными типами Делфи - я не знаю как осуществить. Может кто-то подскажет? (Интересны были бы и другие варианты решения этой проблемы.)


TTCustomDelphiMaster   (2002-10-22 21:45:00) [1]

Можно и так попробовать.

const
E10 = 10000000000;
MaxReg = 5;
type
Int60 = record
Reg: array [0..MaxReg] of integer;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function AddInt60(a,b: Int60): Int60;
var
i: integer;
CF: integer;
begin
CF := 0;
for i := 0 to MaxReg do
begin
Result.Reg[i] := a.Reg[i] + b.Reg[i] + CF;
CF := Result.Reg[i] div E10;
Result.Reg[i] := Result.Reg[i] - CF * E10;
end;
end;

function Int60ToStr(a: Int60): string;
var
i, k: integer;
begin
Result := "";
for i := MaxReg downto 0 do
begin
Result := Result + Format("%9.9d", [a.Reg[i]]);
end;
for i := 1 to Length(Result) do
if Result[i] = "0" then
Result[i] := " "
else
Break;
Trim(Result);
if Result = "" then
Result := "0";
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a,b: Int60;
begin
a.Reg[0] := 999999999;
a.Reg[1] := 0;
a.Reg[2] := 0;
a.Reg[3] := 12345;
a.Reg[4] := 12345;
a.Reg[5] := 0;
b.Reg[0] := 999999999;
b.Reg[1] := 1100;
b.Reg[2] := 0;
b.Reg[3] := 0;
b.Reg[4] := 0;
b.Reg[5] := 9901;
ShowMessage(Int60ToStr(AddInt60(a,b)));
end;


Юрий Зотов   (2002-10-22 21:32:00) [2]

BCD?


Sharik_212   (2002-10-22 20:31:00) [3]

можно оперировать числами в виде строк (String), правда, придется дописать кой-чего (напр. все операции)


Внук   (2002-10-22 14:55:00) [4]

Alx2 © (22.10.02 14:48)
:)) Боюсь, автор имел в виду не битовые разряды, а вовсе даже десятичные...


Alx2   (2002-10-22 14:48:00) [5]

>В работе возникла необходимость работы с числами целочисельного
>типа данных содержащими более 60 разрядов.

int64 - 64 разряда


Столбик   (2002-10-22 14:44:00) [6]

Можно создать набор ф-й для сложения/вычитания/умножения/деления и т.п. в символьном виде. Типа столбиком.


Игорь Шевченко   (2002-10-22 14:28:00) [7]

Массив, к примеру, с элементом для каждого десятичного разряда. Точность - любая вообразимая. Алгоритм работы известен из школьного курса арифметики (1-2 класс)


Наверх

Титульная страница Поиск, карта сайта Написать письмо