![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с числами целого типа с более чем 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 класс)