Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   *Теория* | Калькулятор с бесконечной точностью (http://forum.oszone.net/showthread.php?t=55216)

Mavlyudov 15-10-2005 18:28 364564

*Теория* | Калькулятор с бесконечной точностью
 
Приветствую всех. Подкиньте идею, как сделать калькулятор с бесконечной точностью, где можно умножать, складывать и т.д огромные числя и получать бесконечную точность.

Shad0VV 15-10-2005 20:05 364573

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

Mavlyudov 15-10-2005 21:11 364588

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

Savant 15-10-2005 21:12 364590

побитово :)

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


Mavlyudov 15-10-2005 22:11 364604

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

Savant 15-10-2005 23:03 364618

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

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 364621

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

Mavlyudov 16-10-2005 00:59 364634

Я так понял, если a[i] и bit[j] > 0, то a_bit=1, иначе a_bit =0 ?????????

ivank 16-10-2005 18:58 364750

Обычно это называют длинной арифметикой иделают её по основанию 10 (как вариант - 10^n), а не 2. Потому что входные/выходные данные обычно в десятичном виде, а значаит операции ввода/вывода будет делать проще. Есть много информации в сети об этом. Из легко доступного и понятного могу посоветовать книгу Окулова "Программирование в алгоритмах". Ну или вездесущий Яндекс поможет.

CyberDaemon 17-10-2005 09:00 364850

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


Время: 12:17.

Время: 12:17.
© OSzone.net 2001-