Помощь - Поиск - Пользователи - Календарь
Полная версия: 3.14...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Vasya!
Говорят, что копьютер вычислял-вычислял и вычислил (например за трое суток) 500 000 000 знаков.

А как вычисляется число Пи?
klem4
А поискать не пробовал ?

Нахождение числа ПИ
Vasya!
Это я видел. А я бы хотел понять алгоритм нахождения числа (и желательно больше 54 000).
volvo
Цитата
и желательно больше 54 000
Переходи на 32 бита, где длина строки может достигать 2 Gb, и вычисляй сколько нужно знаков... В ДОС-овском Паскале ты ограничен размером сегмента, отсюда и ограничение на число символов...
Vasya!
А как насчет принципа, алгоритма вычисления числа.
volvo
Я же написал в теме по ссылке, что не имею понятия об алгоритме. Невнимательно читал?

Погугли на тему "BBP - Formula", "Bailey-Borwein-Plouffe Formula"... Что-нибудь да найдется wink.gif
Vasya!
Спасибо and sorry!!!
Lapp
Алгоритмов существет много разных. Самый простой и понятный - формула Лейбница:

П/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ..

Поскольку ряд знакопеременный с убывающим по модулю общим членом, то точность конечной суммы оценивается последним членом. То есть написанный выше кусок даст примерно точность до первого знака после запятой, а если нужно, например, точность до третьего знака, 0.001 (одна тысячная) , то нужно взять сумму, заканчивающуюся членом 1/1001, то есть примерно 500 членов ряда.

Извиняюсь в посте была ошибка. Сейчас исправлено (выделено зеленым цветом)
Lapp
Понятно, что формула Лейбница сходится очень медленно. Вот этот ряд сходится гораздо скорее:

П/(2*Sqrt(3) = 1 - (1/3)(1/3) + (1/5)(1/3)^2 - (1/7)(1/3)^3 + (1/9)(1/3)^4 - (1/11)(1/3)^5 + ...

Приведенный его фрагмент обеспечивает точность лучше одной сотой, а если добавить еще всего один член, то будет 0.001, на достижение которой с формулой Лейбница уходит 500 членов.
Vasya!
А если вычислять по формуле Лейбница, то этот процесс понятно, что долгий, но он точный?
Lapp
Цитата(Vasya! @ 11.10.2006 19:36) *

А если вычислять по формуле Лейбница, то этот процесс понятно, что долгий, но он точный?

Я же написал оценку точности! Или ты думаешь, что это теория, которая типа сама по себе, а практика сама по себе?...
Повторяю: любой знакопеременный ряд с убывающим по модулю общим членом оценивается следующим образом (в предположении, что An<0, а A(n+1)>0 ) :

Sn < S < S(n+1) ,

где S - бесконечеая сумма. Вычитая из правого неравенства Sn, имеем:

S - Sn < S(n+1) - Sn = A(n+1)

Поскольку обе стороны положительны, можем поставить модули

|S - Sn| < |S(n+1) - Sn| = |A(n+1)|

Я не буду доказывать эту формулу для An>0, это практически очевидно.
Сказанное можно проиллюстрировать картинкой:
Нажмите для просмотра прикрепленного файла
Короче, имеем следующее:
Несмотря на то, что мы не знаем бесконечной суммы и не можем ее узнать, мы можем сказать, что всякая n-ная конечная сумма отличается от нее по модулю не более, чем модуль следующего члена ряда. Иначе говоря, если мы знаем, что |An|=0.001, то для того, чтобы получить точность в одну тысячную, нам достаточно сложить n-1 членов ряда.

Теперь ясно?
Reflex
есть еще алгоритм через арктангенсы как-то...
Lapp
Цитата(Reflex @ 12.10.2006 7:54) *

есть еще алгоритм через арктангенсы как-то...

Уважаемая Reflex, да будет тебе известно, что вторая из приведенных мной формул и есть разложение арктангенса в ряд..
Vasya!
Огромное спасибо!!! Буду пока разбираться с тем что есть.

Кстати С Днем Рождения!!!
Vasya!
Иначе говоря, если мы знаем, что |An|=0.001, то для того, чтобы получить точность в одну тысячную, нам достаточно сложить n-1 членов ряда.

Вот это не очень ясно! Пример какой-то можешь привести.
Lapp
Цитата(Vasya! @ 22.10.2006 13:54) *

Вот это не очень ясно! Пример какой-то можешь привести.

Какой пример?.. Я привел тебе точное математическое доказательство! Да еще и с рисунком!! Дай себе труд всмотреться в график - и ты все поймешь, там нет ничего сложного. Или уж открой любой учебник по матану, найди там тему знакопеременные ряды, прочти доказательство еще раз.

А пример - ты, в конце концов его сам и делаешь. Так трудно закодировать несколько строк и убедиться?
Код
{ Calculation the Pi, Liebniz formula }
var
  i,n:integer;
  s,z:real;

begin
  Write(' N = ');ReadLn(n);
  s:=0;
  z:=1;
  for i:=1 to n-1 do begin
    s:=s+z*1/(2*i-1);
    z:=-z
  end;
  WriteLn(' An       = ',(1/n):10:8);
  WriteLn(' S(n-1)   = ',s:10:8);
  WriteLn(' Pi/4     = ',(Pi/4):10:8);
  WriteLn(' 4*S(n-1) = ',(4*s):10:8);
  WriteLn(' Pi       = ',Pi:10:8);
  ReadLn
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.