Расчет Pi с использованием цикла for - PullRequest
0 голосов
/ 08 июля 2011

Я только что сделал программу, которая вычисляет пи. Тем не менее, даже с 10 миллионами итераций мой результат немного отличается. Я получаю 3.141592 7535897831 , тогда как уже на раннем этапе это неправильно. Он должен быть 3.141592 653589793238 ...

Итак, мой вопрос: какое количество итераций требуется для получения хотя бы точного ответа вплоть до 10 ^ -16

Вот мой код, если кому-то интересно:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
long double pi = 4.0;
long double tempPi;
for (int i = 1, j = 3; i <= 10000000; i++, j+=2)
{
    tempPi = static_cast<double>(4)/j;
    if (i%2 != 0)
    {
            pi -= tempPi;
    }
    else if (i%2 == 0)
    {
         pi += tempPi;
    }
}        
cout << "Pi has the value of: " << setprecision(16) << fixed << pi << endl;
system("pause");
return 0;

}

Любые советы, связанные с производительностью, также приветствуются.

Ответы [ 4 ]

6 голосов
/ 08 июля 2011

Вы используете серию Лейбница, которая очень, очень медленно сходится. В чередующемся ряду, таком как тот, который вы используете, первый пропущенный член дает хорошую оценку ошибки в оценке. Ваш первый опущенный термин - 4/2000005, поэтому вам следует ожидать здесь менее шести значащих цифр точности.

Обратите внимание: ошибки округления, использование чисел двойной точности не имеет ничего общего с недостатком точности. Единственным фактором является то, что вы используете дерьмовый алгоритм.

4 голосов
/ 08 июля 2011

Проблема в том, что double далеко не так точен, как вы надеетесь. Вы даже не можете представить десятичное значение 1,2 со 100% точностью.

Я не внимательно изучил код, чтобы увидеть, есть ли другие проблемы.

4 голосов
/ 08 июля 2011

Есть много методов для вычисления числа пи.Некоторые сходятся быстрее, чем другие.

Также см. «Современные формулы»

the sequence 1 / a converges quartically to pi, giving about 100 digits in three steps and over a trillion digits after 20 steps.
0 голосов
/ 08 июля 2011

Поскольку после 10 миллионов итераций результат является неправильным из-за ошибок округления, вы не получите правильный ответ с большим количеством циклов, только добавив больше ошибок.

...