Перейти к содержимому

Как высчитать число пи

  • автор:

Как высчитать число пи

Самый простой и легкий в реализации метод.

Рассмотрим произвольный квадрат с центром в начале координат и вписанный в него круг. Будем рассматривать только первую координатную четверть. В ней будет находиться четверть круга и четверть квадрата. Обозначим радиус круга r, тогда четверть квадрата тоже будет квадратом(очевидно) со стороной r.

Будем случайным образом выбирать точки в этом квадрате и считать количество точек, попавших в четверть круга. Благодаря теории вероятности мы знаем, что отношение попаданий в четверть круга к попаданиям ‘в молоко’ равно отношению площадей — пи/4. Вот, собственно, и весь алгоритм. Чем больше взятых наугад точек мы проверим, тем точнее будет отношение площадей.

Вот простенькая программа на Паскале, считающая пи этим способом. Четыре первых знака требуют на моем PentiumII-300 около 5 минут.

uses Crt; const n=10000000; r=46340; r2=46340*46340; var i,pass : LongInt; x,y : real; begin WriteLn('Поехали!'); Randomize; pass:=0; for i:=1 to n do begin x:=Random(r+1); y:=Random(r+1); if ( x*x+y*y < r2 ) then INC(pass); end; TextColor(GREEN); WriteLn('Число ПИ получилось равным: ',(pass/i*4):0:5); ReadLn; end.

Однако, как говорил Козьма Прутков, 'нельзя объять необъятное', что, в применении к данному случаю, можно перефразировать так: нельзя просуммировать бесконечное число слагаемых за конечное время, каким бы быстрым компьютером мы не располагали.

Слава Богу, этого и не требуется. Поскольку мы хотим найти не точное значение PI, а лишь его приближение с пятью верными десятичными знаками, нам достаточно просуммировать такое количество первых членов ряда, чтобы сумма всех оставшихся членов не превышала 10 -5 .

Остался, правда, открытым вопрос о том, сколько же все-таки членов ряда нужно просуммировать, чтобы получить результат с требуемой точностью?

Ответ на этот вопрос в 'общем виде' выходит далеко за рамки настоящего обсуждения. Это отдельная тема в курсах математического анализа и численных методов.

К счастью, данный конкретный ряд позволяет найти очень простое правило, позволяющее определить момент, когда следует прекратить суммирование. Дело в том, что ряд Грегори является знакопеременным и сходится равномерно (хотя и медленнее, чем хотелось бы). Это означает, что для любого нечетного n , сумма первых n членов ряда всегда дает верхнюю оценку для PI, а сумма n +1 первых членов ряда - нижнюю.

Значит, как только разница между верхней и нижней оценками окажется меньше, чем требуемая точность, можно смело прекращать вычисления и быть уверенным, что как та, так и другая оценки отличаются от истинного значения PI не более, чем на 10 -5 . В качестве окончательного результата разумно взять среднее значение между полученными верхней и нижней оценками. Таким образом, можно предложить алгоритм, приведенный ниже.

Положить n=0, S1 = 0 и S2 = 0; ( начальные установки ) Увеличить n на 1; ( n становится нечетным ) Вычислить S1 = S2 + 4/(2n-1); (S1 - есть верхняя оценка ) Увеличить n на 1; ( n становится четным ) Вычислить S2 = S1 - 4/(2n-1); (S2 - есть нижняя оценка) Если S1 - S2 >= 10^(-5) перейти к шагу 2; ( нужная точность еще не достигнута ) Напечатать результат (S1 + S2) / 2

При реализации этого алгоритма на машине следует помнить, что ряд Грегори сходится достаточно медленно, и поэтому n может принимать довольно большие значения.

Для вычисления сколько-нибудь большого количества знаков пи предыдущий способ уже не годится. Но существует большое количество последовательностей, сходящихся к Пи гораздо быстрее. Воспользуемся, например, формулой Гаусса:

p = 12arctan 1 + 8arctan 1 - 5arctan 1
4 18 57 239

Доказательство этой формулы несложное, поэтому мы его опустим.

Исходник программы, включающий в себя 'длинную арифметику'

Программа вычисляет NbDigits первых цифр числа Пи. Функция вычисления arctan названа arccot, так как arctan(1/p) = arccot(p), но расчет происходит по формуле Тейлора именно для арктангенса, а именно arctan(x) = x - x 3 /3 + x 5 /5 - . x=1/p, значит arccot(x) = 1/p - 1 / p 3 / 3 + . Вычисления происходят рекурсивно: предыдущий элемент суммы делится и дает следующий.

/* ** Pascal Sebah : September 1999 ** ** Subject: ** ** A very easy program to compute Pi with many digits. ** No optimisations, no tricks, just a basic program to learn how ** to compute in multiprecision. ** ** Formulae: ** ** Pi/4 = arctan(1/2)+arctan(1/3) (Hutton 1) ** Pi/4 = 2*arctan(1/3)+arctan(1/7) (Hutton 2) ** Pi/4 = 4*arctan(1/5)-arctan(1/239) (Machin) ** Pi/4 = 12*arctan(1/18)+8*arctan(1/57)-5*arctan(1/239) (Gauss) ** ** with arctan(x) = x - x^3/3 + x^5/5 - . ** ** The Lehmer's measure is the sum of the inverse of the decimal ** logarithm of the pk in the arctan(1/pk). The more the measure ** is small, the more the formula is efficient. ** For example, with Machin's formula: ** ** E = 1/log10(5)+1/log10(239) = 1.852 ** ** Data: ** ** A big real (or multiprecision real) is defined in base B as: ** X = x(0) + x(1)/B^1 + . + x(n-1)/B^(n-1) ** where 0 Work with double instead of long and the base B can ** be choosen as 10^8 ** => During the iterations the numbers you add are smaller ** and smaller, take this in account in the +, *, / ** => In the division of y=x/d, you may precompute 1/d and ** avoid multiplications in the loop (only with doubles) ** => MaxDiv may be increased to more than 3000 with doubles ** => . */ #include #include #include #include long B=10000; /* Working base */ long LB=4; /* Log10(base) */ long MaxDiv=450; /* about sqrt(2^31/B) */ /* ** Set the big real x to the small integer Integer */ void SetToInteger (long n, long *x, long Integer) < long i; for (i=1; i/* ** Is the big real x equal to zero ? */ long IsZero (long n, long *x) < long i; for (i=0; i/* ** Addition of big reals : x += y ** Like school addition with carry management */ void Add (long n, long *x, long *y) < long carry=0, i; for (i=n-1; i>=0; i--) < x[i] += y[i]+carry; if (x[i]> > /* ** Substraction of big reals : x -= y ** Like school substraction with carry management ** x must be greater than y */ void Sub (long n, long *x, long *y) < long i; for (i=n-1; i>=0; i--) < x[i] -= y[i]; if (x[i]<0) < if (i) < x[i] += B; x[i-1]--; >> > > /* ** Multiplication of the big real x by the integer q ** x = x*q. ** Like school multiplication with carry management */ void Mul (long n, long *x, long q) < long carry=0, xi, i; for (i=n-1; i>=0; i--) < xi = x[i]*q; xi += carry; if (xi>=B) < carry = xi/B; xi -= (carry*B); >else carry = 0; x[i] = xi; > > /* ** Division of the big real x by the integer d ** The result is y=x/d. ** Like school division with carry management ** d is limited to MaxDiv*MaxDiv. */ void Div (long n, long *x, long d, long *y) < long carry=0, xi, q, i; for (i=0; i> /* ** Find the arc cotangent of the integer p (that is arctan (1/p)) ** Result in the big real x (size n) ** buf1 and buf2 are two buffers of size n */ void arccot (long p, long n, long *x, long *buf1, long *buf2) < long p2=p*p, k=3, sign=0; long *uk=buf1, *vk=buf2; SetToInteger (n, x, 0); SetToInteger (n, uk, 1); /* uk = 1/p */ Div (n, uk, p, uk); Add (n, x, uk); /* x = uk */ while (!IsZero(n, uk)) < if (p/* One step for small p */ else < Div (n, uk, p, uk); /* Two steps for large p (see division) */ Div (n, uk, p, uk); > /* uk = u(k-1)/(p^2) */ Div (n, uk, k, vk); /* vk = uk/k */ if (sign) Add (n, x, vk); /* x = x+vk */ else Sub (n, x, vk); /* x = x-vk */ k+=2; sign = 1-sign; > > /* ** Print the big real x */ void Print (long n, long *x) < long i; printf ("%d.", x[0]); for (i=1; iprintf ("\n"); > /* ** Computation of the constant Pi with arctan relations */ void main () < clock_t endclock, startclock; long NbDigits=10000, NbArctan; long p[10], m[10]; long size=1+NbDigits/LB, i; long *Pi = (long *)malloc(size*sizeof(long)); long *arctan = (long *)malloc(size*sizeof(long)); long *buffer1 = (long *)malloc(size*sizeof(long)); long *buffer2 = (long *)malloc(size*sizeof(long)); startclock = clock(); /* ** Formula used: ** ** Pi/4 = 12*arctan(1/18)+8*arctan(1/57)-5*arctan(1/239) (Gauss) */ NbArctan = 3; m[0] = 12; m[1] = 8; m[2] = -5; p[0] = 18; p[1] = 57; p[2] = 239; SetToInteger (size, Pi, 0); /* ** Computation of Pi/4 = Sum(i) [m[i]*arctan(1/p[i])] */ for (i=0; i0) Add (size, Pi, arctan); else Sub (size, Pi, arctan); > Mul (size, Pi, 4); endclock = clock (); Print (size, Pi); /* Print out of Pi */ printf ("Computation time is : %9.2f seconds\n", (float)(endclock-startclock)/(float)CLOCKS_PER_SEC ); free (Pi); free (arctan); free (buffer1); free (buffer2); >

Конечно, это не самые эффективные способы вычисления числа пи. Существует еще громадное количество формул. Например, формула Чудновского (Chudnovsky), разновидности которой используются в Maple. Однако в обычной практике программирования формулы Гаусса вполне хватает, поэтому эти методы не будут описываться в статье. Вряд ли кто-то хочет вычислять миллиарды знаков пи, для которых сложная формула дает большое увеличение скорости.

Вычисление N-го знака числа Пи без вычисления предыдущих

image

С недавних пор существует элегантная формула для вычисления числа Пи, которую в 1995 году впервые опубликовали Дэвид Бэйли, Питер Борвайн и Саймон Плафф:

Казалось бы: что в ней особенного — формул для вычисления Пи великое множество: от школьного метода Монте-Карло до труднопостижимого интеграла Пуассона и формулы Франсуа Виета из позднего Средневековья. Но именно на эту формулу стоит обратить особое внимание — она позволяет вычислить n-й знак числа пи без нахождения предыдущих. За информацией о том, как это работает, а также за готовым кодом на языке C, вычисляющим 1 000 000-й знак, прошу под хабракат.

Как же работает алгоритм вычисления N-го знака Пи?
К примеру, если нам нужен шестнадцатеричный знак числа Пи, мы домножаем всю формулу на 16^1000, тем самым обращая множитель, стоящий перед скобками, в 16^(1000-k). При возведении в степень мы используем двоичный алгоритм возведения в степень или, как будет показано в примере ниже, возведение в степень по модулю. После этого вычисляем сумму нескольких членов ряда. Причём необязательно вычислять много: по мере возрастания k 16^(N-k) быстро убывает, так что, последующие члены не будут оказывать влияния на значение искомых цифр). Вот и вся магия — гениальная и простая.

Формула Бэйли-Борвайна-Плаффа была найдена Саймоном Плаффом при помощи алгоритма PSLQ, который был в 2000 году включён в список Top 10 Algorithms of the Century. Сам же алгоритм PSLQ был в свою очередь разработан Бэйли. Вот такой мексиканский сериал про математиков.
Кстати, время работы алгоритма — O(N), использование памяти — O(log N), где N — порядковый номер искомого знака.

Думаю, уместно будет привести код на языке Си, написанный непосредственно автором алгоритма, Дэвидом Бэйли:

/* This program implements the BBP algorithm to generate a few hexadecimal digits beginning immediately after a given position id, or in other words beginning at position id + 1. On most systems using IEEE 64-bit floating- point arithmetic, this code works correctly so long as d is less than approximately 1.18 x 10^7. If 80-bit arithmetic can be employed, this limit is significantly higher. Whatever arithmetic is used, results for a given position id can be checked by repeating with id-1 or id+1, and verifying that the hex digits perfectly overlap with an offset of one, except possibly for a few trailing digits. The resulting fractions are typically accurate to at least 11 decimal digits, and to at least 9 hex digits. */ /* David H. Bailey 2006-09-08 */ #include #include int main() < double pid, s1, s2, s3, s4; double series (int m, int n); void ihex (double x, int m, char c[]); int NHX 16 char chx[NHX]; /* id is the digit position. Digits generated follow immediately after id. */ s1 = series (1, id); s2 = series (4, id); s3 = series (5, id); s4 = series (6, id); pid = 4. * s1 - 2. * s2 - s3 - s4; pid = pid - (int) pid + 1.; ihex (pid, NHX, chx); printf (" position = %i\n fraction = %.15f \n hex digits = %10.10s\n", id, pid, chx); >void ihex (double x, int nhx, char chx[]) /* This returns, in chx, the first nhx hex digits of the fraction of x. */ < int i; double y; char hx[] = "0123456789ABCDEF"; y = fabs (x); for (i = 0; i < nhx; i++)< y = 16. * (y - floor (y)); chx[i] = hx[(int) y]; >> double series (int m, int id) /* This routine evaluates the series sum_k 16^(id-k)/(8*k+m) using the modular exponentiation technique. */ < int k; double ak, eps, p, s, t; double expm (double x, double y); #define eps 1e-17 s = 0.; /* Sum the series up to id. */ for (k = 0; k < id; k++)< ak = 8 * k + m; p = id - k; t = expm (p, ak); s = s + t / ak; s = s - (int) s; >/* Compute a few terms where k >= id. */ for (k = id; k return s; > double expm (double p, double ak) /* expm = 16^p mod ak. This routine uses the left-to-right binary exponentiation scheme. */ < int i, j; double p1, pt, r; #define ntp 25 static double tp[ntp]; static int tp1 = 0; /* If this is the first call to expm, fill the power of two table tp. */ if (tp1 == 0) < tp1 = 1; tp[0] = 1.; for (i = 1; i < ntp; i++) tp[i] = 2. * tp[i-1]; >if (ak == 1.) return 0.; /* Find the greatest power of two less than or equal to p. */ for (i = 0; i < ntp; i++) if (tp[i] >p) break; pt = tp[i-1]; p1 = p; r = 1.; /* Perform binary exponentiation algorithm modulo ak. */ for (j = 1; j = pt) < r = 16. * r; r = r - (int) (r / ak) * ak; p1 = p1 - pt; >pt = 0.5 * pt; if (pt >= 1.) < r = r * r; r = r - (int) (r / ak) * ak; >> return r; > 

Какие возможности это даёт? Например: мы можем создать систему распределённых вычислений, рассчитывающую число Пи и поставить всем Хабром новый рекорд по точности вычисления (который сейчас, к слову, составляет 10 триллионов знаков после запятой). Согласно эмпирическим данным, дробная часть числа Пи представляет собой нормальную числовую последовательность (хотя доказать это достоверно ещё не удалось), а значит, последовательности цифр из него можно использовать в генерации паролей и просто случайных чисел, или в криптографических алгоритмах (например, в хэшировании). Способов применения можно найти великое множество — надо только включить фантазию.

Больше информации по теме вы можете найти в статье самого Дэвида Бэйли, где он подробно рассказывает про алгоритм и его имплементацию (pdf);

И, похоже, вы только что прочитали первую русскоязычную статью об этом алгоритме в рунете — других я найти не смог.

Как высчитать число пи

Опубликовал
Камила Валиева 1 статья

Вся вселенная в числе Пи.

Число Пи и интересные факты о нем.

  • Число Пи - самая известная константа в математическом мире.
  • В эпизоде сериала Стар Трек «Волк в овчарне» Спок командует компьютеру из фольги «вычислить до последней цифры значение числа Пи».
  • Комик Джон Эванс однажды язвительно заметил: «Что Вы получите, если разделите окружность фонаря из тыквы с прорезанными отверстиями в виде глаза, носа и рта на его диаметр? Тыкву π!».
  • Учёные в романе Карла Сагана «Связь» пытались разгадать довольно точное значение числа Пи, чтобы найти скрытые сообщения от создателей человеческой расы и открыть людям доступ к "более глубоким уровням вселенских знаний".
  • Символ Пи (π) используется в математических формулах уже на протяжении 250 лет.
  • Во время знаменитого суда над О.Дж.Симпсоном возникли споры между адвокатом Робертом Бласиером и агентом ФБР о фактическом значении числа Пи. Задумано это всё было для того, чтобы выявить недостатки в уровне знаний агента госслужбы.
  • Мужской одеколон от компании Гивенчи, названный «Пи», предназначен для привлекательных и дальновидных людей.
  • Мы никогда не сможем с точностью измерить окружность или площадь круга, так как не знаем полное значение числа Пи. Данное «магическое число» является иррациональным, то есть его цифры вечно меняются в случайной последовательности.
  • В греческом («π» (piwas)) и английском («p») алфавитах этот символ располагается на 16 позиции.
  • В процессе измерений размеров Великой пирамиды в Гизе оказалось, что она имеет такое же соотношение высоты к периметру своего основания, как радиус окружности к ее длине, то есть 1/2π
  • В математике π определяется отношением длины окружности круга к его диаметру. Другими словами, π число раз диаметра круга равно его периметру.
  • Первые 144 цифры числа Пи после запятой заканчиваются цифрами 666, которые упоминаются в Библии как «число зверя».
  • Если рассчитать длину экватора Земли с использованием числа π с точностью до девятого знака, ошибка в расчетах составит около 6 мм.
  • В 1995 году Хирюки Гото смог воспроизвести по памяти 42 195 знаков числа Пи после запятой, и до сих пор считается действительным чемпионом в этой области.
  • Людольф ван Цейлен (род.1540 – ум.1610 гг.) провёл большую часть своей жизни над расчетами первых 36 цифр после запятой числа Пи (которые были назваными «цифрами Лудольфа»). Согласно легенде, эти цифры были выгравированы на его надгробной плите после смерти.
  • Уильям Шэнкс (род.1812-ум.1882 гг.) работал в течение многих лет, чтобы найти первые 707 цифр числа Пи. Как оказалось позже, он допустил ошибку в 527 разряде.
  • В 2002 году японский учёный просчитал 1,24 триллиона цифр в числе Пи с помощью мощного компьютера Hitachi SR 8000. В октябре 2011 года число π было рассчитано с точностью до 10.000.000.000.000 знаков после зяпятой
  • Так как 360 градусов в полном круге и число Пи тесно связаны, некоторые математики пришли в восторг, узнав, что цифры 3, 6 и 0 находится на триста пятьдесят девятом разряде после запятой в числе Пи.
  • Одно из первых упоминаний о числе Пи можно встретить в текстах египетского писца по имени Ахмес (около 1650 года до н. э.), известных сейчас как папирус Ахмеса (Ринда).
  • Люди изучают число π уже на протяжении 4000 лет.
  • В папирусе Ахмеса запечатлена первая попытка рассчитать число Пи по «квадратуре круга», которая заключалась в измерении диаметра круга по созданным внутри квадратам.
  • В 1888 году доктор по имени Эдвин Гудвин заявил, что он обладает «сверхъестественным значением» точной меры круга. Вскоре был предложен законопроект в парламенте, по принятию которого Эдвин мог бы опубликовать авторские права на свои математические результаты. Но этого так и не произошло - законопроект не стал законом, благодаря профессору математики в законодательном органе, которые доказал, что метод Эдвина привел к очередному неверному значению числа Пи.
  • Первый миллион знаков после запятой в числе Пи состоит из: 99959 нулей, 99758 единиц, 100026 двоек, 100229 троек, 100230 четвёрок, 100359 пятёрок, 99548 шестёрок, 99800 семёрок, 99985 восьмёрок и 100106 девяток.
  • День Пи отмечается 14 марта (выбран был по причине схожести с 3.14). Официальное празднование начинается в 1:59 после полудня, дабы соблюсти полное соответствии с 3/14|1:59.
  • Значение первых чисел в числе Пи после впервые правильно рассчитал одни из величайших математиков древнего мира, Архимед из Сиракуз (род.287 – ум.212 г. до н. э.). Он представил это число в виде нескольких дробей По легенде, Архимед был настолько увлечён расчетами, что не заметил, как римские солдаты взяли его родной город Сиракузы. Когда римский солдат подошел к нему, Архимед закричал по-гречески: «Не трогай моих кругов!». В ответ на это солдат заколол его мечом.
  • Точное значение числа Пи было получено китайской цивилизацией намного раньше, чем западной. Китайцы имели два преимущества по сравнению с большинством других стран мира: они использовали десятичную систему обозначения и символ нуля. Европейские математики как раз-таки наоборот не использовали символическое обозначение нуля в счетных системах до позднего средневековья, пока не вступили в контакт с индийскими и арабскими математиками.
  • Аль-Хорезми (основатель алгебры) упорно работал над расчетами числа Пи и добился первых четырёх чисел: 3,1416. Термин «алгоритм» происходит от имени этого великого среднеазиатского учёного, а из его текста Китаб аль-Джабер валь-Мукабала появилось слово «алгебра».
  • Древние математики пытались вычислить Пи, каждый раз вписывая полигоны с большим количеством сторон, которые намного теснее вписывались в площадь круга. Архимед использовал 96-угольник. Китайский математик Лю Хуэй вписал 192-угольник, и потом 3072-угольник. Цу Чун и его сыну удалось вместить многоугольник с 24576 сторонами
  • Уильям Джонс (род.1675 – ум.1749) ввел символ «π» в 1706 году, который позднее был популяризирован в математическом сообществе Леонардо Эйлером (род.1707 – ум.1783).
  • Символ Пи «π» стал использоваться в математике лишь в 1700-х годах, арабы изобрели десятичную систему в 1000 г., а знак равенства «=» появился в 1557 году.
  • Леонардо да Винчи (род.1452 – ум.1519) и художник Альбрехт Дюрер (род.1471 – ум.1528) имели небольшие наработки по «квадратуре круга», то есть владели приблизительным значением числа Пи.
  • Исаак Ньютон рассчитал число Пи до 16 знаков после запятой.
  • Некоторые учёные утверждают, что люди запрограммированы для нахождения закономерностей во всём, потому что только так мы можем придать смысл всему миру и самим себе. И именно поэтому нас так привлекает "незакономерное" число Пи.
  • Число Пи также может упоминаться как «круговая постоянная», «архимедова константа» или «число Лудольфа».
  • В семнадцатом веке число Пи вышло за пределы круга и стало применяться в математических кривых, таких как арка и гипоциклоида. Произошло это после обнаружения, что в данных областях некоторые величины могут быть выражены через само число Пи. В двадцатом веке число Пи уже использовалось во многих математических областях, таких как теория чисел, вероятности и хаоса.
  • Первые шесть цифр числа Пи (314159) располагаются в обратном порядке, по крайней мере, шесть раз в числе первых 10 миллионов десятичных знаков после запятой.
  • Многие математики утверждают, что правильным будет такая формулировка: «круг - фигура с бесконечным количеством углов».
  • Тридцать девять знаков после запятой в числе Пи достаточно для вычисления длины окружности, опоясывающей известные космические объекты во Вселенной, с погрешностью не более чем радиус атома водорода.
  • Платон (род. 427 – ум.348 гг. до н. э.) получил довольно точное значение числа Пи для своего времени: √ 2 + √ 3 = 3,146.

Вычисление числа Пи методом Монте-Карло

Существует много способов вычисления числа Пи. Самым простым и понятным является численный метод Монте-Карло, суть которого сводится к простейшему перебору точек на площади. Суть расчета заключается в том, что мы берем квадрат со стороной a = 2 R, вписываем в него круг радиусом R. И начинаем наугад ставить точки внутри квадрата. Геометрически, вероятность P1 того, чтот точка попадет в круг, равна отношению площадей круга и квадрата:
P1=Sкруг / Sквадрата = πR 2 / a 2 = πR 2 / (2 R ) 2 = πR 2 / (2 R) 2 = π / 4 (1)
Выглядит это так:

Вероятность попадания точки в круг можно также посчитать после численного эксперимента ещё проще: посчитать количество точек, попавших в круг, и поделить их на общее количество поставленных точек:
P2=Nпопавших в круг / Nточек; (2)
Так, при большом количестве точек в численном эксперименте вероятности должны вести себя cледующим образом:
lim(Nточек→∞)⁡(P2-P1)=0; (3)
Следовательно:
π / 4 = Nпопавших в круг / Nточек; (4)
π =4 Nпопавших в круг / Nточек; (5)
НО! При моделировании мы применяем псевдослучайные числа, которые не являются случайным процессом.
Поэтому, выражение (5), к сожалению, строго не выполняется. Логичны вопросы, каковы оптимальные размеры квадрата и как много нужно применить точек?
Чтобы это выяснить, я написал такую программу:

#include #include #define limit_Nmax 1e7 //Максимальное количество точек #define limit_a 1e6 //Максиальный радиус круга #define min_a 100 //Начальный радиус double circle(double, double); //Выдает квадрат y в зависимости от координаты Х и радиуса круга. int main() < double x,y,Pi; long long int a=min_a//сторона квадарата i=0;//Счетчик double Ncirc=0;//Количество точек, попавших в круг double Nmax=a; //Общее количество точек while (ai++; > Pi=(Ncirc/Nmax)*4; Nmax *= 2; printf("\n%lld,%.0f,%f",a,Nmax,Pi); > a*=2; > > double circle(double x, double radius)

Программа выводит значения числа Пи в зависимости от радиуса и количества точек. Единственное, что остается читателю, это скомпилировать её самостоятельно и запустить с параметрами, которые желает он.

Приведу лишь одну таблицу с полученными значениями:

Радиус Nточек Pi
102400 204800 3,145664
102400 409600 3,137188
102400 819200 3,139326
102400 1638400 3,144478
102400 3276800 3,139875
102400 6553600 3,142611
102400 13107200 3,140872
102400 26214400 3,141644
102400 52428800 3,141217
102400 1,05E+08 3,141324
102400 2,1E+08 3,141615
102400 4,19E+08 3,141665
102400 8,39E+08 3,141724
102400 1,68E+09 3,141682

Если что, значение числа Пи можно посмотреть с точностью до определенного знака здесь.
Источник картинки — википедия.

  • численные методы
  • число пи
  • Монте-Карло

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *