Войти

Показать полную графическую версию : *Теория* | Калькулятор с бесконечной точностью


Mavlyudov
15-10-2005, 18:28
Приветствую всех. Подкиньте идею, как сделать калькулятор с бесконечной точностью, где можно умножать, складывать и т.д огромные числя и получать бесконечную точность.

Shad0VV
15-10-2005, 20:05
Хм, я не до конца понимаю термин "бесконечная точность", я реально достигал точности е-097 (е+097), потом просто идет переполнение, как можно достичь бесконечной точночти на машине с ограниченной разрядной сеткой я не понимаю...., хотя может я чего то не знаю, очень хотел бы услышать еще чьи-нибудь коментарии.

Mavlyudov
15-10-2005, 21:11
Ну например, у меня есть два 96-ти битных числа. Как их сложить???

Savant
15-10-2005, 21:12
побитово :)

Основная проблема, как мне видится, не арифметические действия с такими числами, а вывод на экран ответа в системе счисления, основание которой отлично от степени двойки.

Mavlyudov
15-10-2005, 22:11
Ну хоть чт0-то подскажите. Я знаю, что есть какая-то функция тип ads в ассемблере.
Как мне понимается, это будет аналог сложению в столбик-по крайней мере алгоритм.
Или же числа будут обрабатываться по частям... а может использовать динамический массив?
хоть что-нибудь подскажите

Savant
15-10-2005, 23:03
Если не трогать пока ассемблер, то для Паскаля (а Вам какой язык ближе?) (сложение беззнаковых любого размера):

const
k = 12; {12*8=96}
bit: array[0..7] of Byte = (1,2,4,8,16,32,64,128);
var
a, b, c: array[0 .. k - 1] of Byte;
i, j: Byte;
ost: Boolean;
a_bit, b_bit: Boolean;
...
ost := False;
for i := 0 to k - 1 do begin
c[i] := 0;
for j := 0 to 7 do begin
a_bit := a[i] and bit[j] > 0;
b_bit := b[i] and bit[j] > 0;
case Ord(a_bit) + Ord(b_bit) + Ord(ost) of
{0: }
1: begin c[i] := c[i] + bit[j]; ost := False end;
2: ost := True;
3: begin c[i] := c[i] + bit[j] {; ost := True} end;
end;
end;
end;
{ если здесь ost = true , то у нас переполнение }
end.

в принципе, методика различается в зависимости от того, как хранить данные

Mavlyudov
15-10-2005, 23:31
Спасибо. Но, если честно, не очень понятно, что здесь реализовано, хотелось бы все-таки понять.
Единственное, что понял-это a,b числа, с-результат. Поясните, если не трудно. Да, и потом как
работать с этим кодом, как задать значения чисел и проверить результат.

Mavlyudov
16-10-2005, 00:59
Я так понял, если a[i] и bit[j] > 0, то a_bit=1, иначе a_bit =0 ?????????

ivank
16-10-2005, 18:58
Обычно это называют длинной арифметикой иделают её по основанию 10 (как вариант - 10^n), а не 2. Потому что входные/выходные данные обычно в десятичном виде, а значаит операции ввода/вывода будет делать проще. Есть много информации в сети об этом. Из легко доступного и понятного могу посоветовать книгу Окулова "Программирование в алгоритмах". Ну или вездесущий Яндекс поможет (http://www.yandex.ru/yandsearch?rpt=rad&text=%E4%EB%E8%ED%ED%E0%FF+%E0%F0%E8%F4%EC%E5%F2%E8%EA%E0).

CyberDaemon
17-10-2005, 09:00
В институте была задачка, посчитать средствами Паскаля 70! с точностью до знака.
Пришлось учить машину умножать столбиком.
Числа хранили в строковом представлении :)




© OSzone.net 2001-2012