Форум программистов, компьютерный форум CyberForum.ru

Нахождение числа Пи с заданной точностью - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 104, средняя оценка - 4.87
Фантазерка
 Аватар для Фантазерка
9 / 9 / 2
Регистрация: 04.04.2009
Сообщений: 25
13.05.2009, 10:20     Нахождение числа Пи с заданной точностью #1
Помогите пожалуйста с задачей:

Найти значени Пи по формуле
рисунок 1
Вычислить трижды с точностью 0,01 0,001 и 0,0001


Есть сомнения, что приведенная в моем задании формула не совсем корректная (рис1).

Это я нашла в инете:

В 1671 году Джеймс Грегори установил, что:

Этот результат позволил Лейбницу получить очень простое выражение для PI, а именно:

или, после умножения на 4:

Просуммируйте этот ряд и Вы получите число PI.

РИСУНОК 2

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

Слава Богу, этого и не требуется. Поскольку мы хотим найти не точное значение 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 может принимать довольно большие значения.


Это мои попытки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>  
float Pi,s1,s2;
int n;
    
void main (void)
 
{
printf ("\nLet's begin\n");
n=0;
s1=0;
s2=0;
 
do
{
++n;
s1=(s2+4/(2*n-1));
n++;
s2=(s1-(4/(2*n-1)));
}
while ((s1-s2)<=0.01);
 
Pi=(s1+s2)/2;
printf ("\nChislo Pi=%1.2f\n",Pi);
 
n=0;
s1=0;
s2=0;
 
do
{
++n;
s1=(s2+4/(2*n-1));
n++;
s2=(s1-4/(2*n-1));
}
while ((s1-s2)<=0.001);
 
Pi=(s1+s2)/2;
printf ("\nChislo Pi=%1.3f\n",Pi);
 
n=0;
s1=0;
s2=0;
do
{
++n;
s1=(s2+4/(2*n-1));
n++;
s2=(s1-4/(2*n-1));
}
while ((s1-s2)<=0.0001);
 
Pi=(s1+s2)/2;
printf ("\nChislo Pi=%1.4f",Pi);
printf ("\nBye!\n");
 
}
Миниатюры
Нахождение числа Пи с заданной точностью   Нахождение числа Пи с заданной точностью  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Фантазерка
 Аватар для Фантазерка
9 / 9 / 2
Регистрация: 04.04.2009
Сообщений: 25
13.05.2009, 10:25  [ТС]     Нахождение числа Пи с заданной точностью #2
На экран вот что выдает...
Изображения
 
mikutu
26 / 26 / 2
Регистрация: 29.04.2009
Сообщений: 90
13.05.2009, 12:36     Нахождение числа Пи с заданной точностью #3
в условии ошибка вместо while ((s1-s2)<=0.001);
надо while ((s1-s2)>0.001);

для точности 0,01 pi получится 3,14 (посчитал быстро в excel)

да и s1 и s2 должны быть float
Фантазерка
 Аватар для Фантазерка
9 / 9 / 2
Регистрация: 04.04.2009
Сообщений: 25
13.05.2009, 12:51  [ТС]     Нахождение числа Пи с заданной точностью #4
s1 и s2 описаны как float
Исправила везде на ваш вариант while ((s1-s2)>0.001;
В итоге тоже неправильно
Изображения
 
mikutu
26 / 26 / 2
Регистрация: 29.04.2009
Сообщений: 90
13.05.2009, 12:58     Нахождение числа Пи с заданной точностью #5
просто везде в вычислениях напишите вместо n так (float)(n)
просто там преобразование типов не явное и он если как у вас написано будет в s1 и s2 только целые числа записывать
короче для s1 и s2 надо писать так
s1=(s2+4/(2*(float)(n)-1));
s2=(s1-(4/(2*(float)(n)-1)));
в visual studio есть удобная вещь ставим курсор на нужную строчку нажимаем f9 (ставится точка остановки убирается повторным нажатием на f9) после остановки на этой строчки при выполнении программы при навидении курсора на переменую отображается ее текущее значение, продолжить выполнение программы можно с помощью нажатия f5
Фантазерка
 Аватар для Фантазерка
9 / 9 / 2
Регистрация: 04.04.2009
Сообщений: 25
13.05.2009, 13:20  [ТС]     Нахождение числа Пи с заданной точностью #6
Я вместо int n - написала вначале float n и все ок!! Thanks!
Я в этом пишу Microsoft Visual C++ 6.0 - там через f10 пошагово выполняю, просто не могла понять почему он мне целые записывает в s1 и s2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2010, 01:06     Нахождение числа Пи с заданной точностью
Еще ссылки по теме:

Написать программу для вычисления числа с заданной точностью. C++
C++ Функция для вывода числа с заданной точностью
Написать программу для вычисления факториала числа с заданной точностью C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
-KiSSka-
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 3
12.12.2010, 01:06     Нахождение числа Пи с заданной точностью #7
а если с помощью интеграла считать (для простоты можно взять ур-е окружности х^2 + y^2=1, тогда S=Pi*r^2), то точность будет зависеть от количества разбиений отрезка.
Код
#include <iostream>
#include <math.h>
using namespace std;
void main(){
	int n=1000;
	double dx=1./n;
	double g, y,s;
	double m=1/1.0001;
	double k=0;
	double ds=0;
	double Pi;
	for(int i=0;i<n;i++)
{g=k+dx;
if(g>=1){g=m;}
y=sqrt(1-(k*k))-((sqrt(1-(k*k))-sqrt(1-(g*g)))/2);
s=y*dx;
ds+=s;
k+=dx;
cout<<"ploschad': "<<s<<endl;
	}
Pi=4.0*ds;
cout<<endl<<"Pi: "<<Pi<<endl;
}
Добавлено через 17 минут
а чтобы выводилось больше знаков после запятой можно использовать
printf("%3.20f", Pi);
Yandex
Объявления
12.12.2010, 01:06     Нахождение числа Пи с заданной точностью
Ответ Создать тему
Опции темы

Текущее время: 05:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru