Форум: "Основная";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
ВнизРабота с числами целого типа с более чем 60 значащими разрядами. Найти похожие ветки
← →
ProgOnDel (2002-10-22 13:54) [0]В работе возникла необходимость работы с числами целочисельного типа данных содержащими более 60 разрядов. Причём необходима точность выполняемых вычислений до единичного разряда. Ни один стандартный целочисельный тип данных в Делфи на это не способен. Один из возможных путей решения - создание своего типа с нужным мне (в пределах возможного для Харда) максимальным значением и свойствами общими с другими целочисельными типами Делфи - я не знаю как осуществить. Может кто-то подскажет? (Интересны были бы и другие варианты решения этой проблемы.)
← →
Игорь Шевченко (2002-10-22 14:28) [1]Массив, к примеру, с элементом для каждого десятичного разряда. Точность - любая вообразимая. Алгоритм работы известен из школьного курса арифметики (1-2 класс)
← →
Столбик (2002-10-22 14:44) [2]Можно создать набор ф-й для сложения/вычитания/умножения/деления и т.п. в символьном виде. Типа столбиком.
← →
Alx2 (2002-10-22 14:48) [3]>В работе возникла необходимость работы с числами целочисельного
>типа данных содержащими более 60 разрядов.
int64 - 64 разряда
← →
Внук (2002-10-22 14:55) [4]Alx2 © (22.10.02 14:48)
:)) Боюсь, автор имел в виду не битовые разряды, а вовсе даже десятичные...
← →
Sharik_212 (2002-10-22 20:31) [5]можно оперировать числами в виде строк (String), правда, придется дописать кой-чего (напр. все операции)
← →
Юрий Зотов (2002-10-22 21:32) [6]BCD?
← →
TTCustomDelphiMaster (2002-10-22 21:45) [7]Можно и так попробовать.
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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c