Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.04;
Скачать: CL | DM;

Вниз

Работа с числами целого типа с более чем 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
8-11345
loon
2002-07-12 14:54
2002.11.04
AVI в ЕХЕ файле


1-11194
slgeo
2002-10-24 14:59
2002.11.04
Глюки в IDE


3-11096
Стас
2002-10-10 08:20
2002.11.04
BDE+Paradox или ADO+Access


6-11376
Beglec
2002-08-22 04:09
2002.11.04
Прослушка портов в Windows Xp


3-11087
Karbo
2002-10-15 20:35
2002.11.04
Можно ли работать с базой как с типизированным файлом ?