Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/196: Рейтинг темы: голосов - 196, средняя оценка - 4.72
 Аватар для Фантазерка
9 / 9 / 0
Регистрация: 04.04.2009
Сообщений: 25

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

13.05.2009, 10:20. Показов 41212. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста с задачей:

Найти значени Пи по формуле
рисунок 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");
 
}
Миниатюры
Нахождение числа Пи с заданной точностью   Нахождение числа Пи с заданной точностью  
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.05.2009, 10:20
Ответы с готовыми решениями:

Нахождение суммы ряда с заданной точностью
#include &lt;cmath&gt; #include &lt;iostream&gt; using namespace std; double f(int n) { double x; x=3*log10(2.4); x*=1/powf(x,n); ...

Нахождение суммы с заданной точностью eps
Доброго времени суток. Есть задание создать М-скрипт для расчета суммы ряда с заданной точностью eps, если x &lt;&gt; 0, eps&gt; 0....

Нахождение суммы ряда с заданной точностью
Учусь на первом курсе и тут задание: Составить программу на языке Pascal используя цикл с предусловием, для нахождения: суммы ряда с...

9
 Аватар для Фантазерка
9 / 9 / 0
Регистрация: 04.04.2009
Сообщений: 25
13.05.2009, 10:25  [ТС]
На экран вот что выдает...
Изображения
 
1
27 / 27 / 10
Регистрация: 29.04.2009
Сообщений: 90
13.05.2009, 12:36
в условии ошибка вместо while ((s1-s2)<=0.001);
надо while ((s1-s2)>0.001);

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

да и s1 и s2 должны быть float
2
 Аватар для Фантазерка
9 / 9 / 0
Регистрация: 04.04.2009
Сообщений: 25
13.05.2009, 12:51  [ТС]
s1 и s2 описаны как float
Исправила везде на ваш вариант while ((s1-s2)>0.001;
В итоге тоже неправильно
Изображения
 
1
27 / 27 / 10
Регистрация: 29.04.2009
Сообщений: 90
13.05.2009, 12:58
просто везде в вычислениях напишите вместо 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
2
 Аватар для Фантазерка
9 / 9 / 0
Регистрация: 04.04.2009
Сообщений: 25
13.05.2009, 13:20  [ТС]
Я вместо int n - написала вначале float n и все ок!! Thanks!
Я в этом пишу Microsoft Visual C++ 6.0 - там через f10 пошагово выполняю, просто не могла понять почему он мне целые записывает в s1 и s2
1
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 3
12.12.2010, 01:06
а если с помощью интеграла считать (для простоты можно взять ур-е окружности х^2 + y^2=1, тогда S=Pi*r^2), то точность будет зависеть от количества разбиений отрезка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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);
1
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 24
18.03.2017, 04:38
-KiSSka-, Знаки выводятся, но после 16-го все нули. Есть еще идеи, а то оч нужно это решение, а ума не дам
Миниатюры
Нахождение числа Пи с заданной точностью  
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
18.03.2017, 17:32
andrevo, сколько знаков нужно? Надо понимать, что точность представления чисел типом double является конечной и соответствует как-раз 15-16 десятичным знакам. Чтобы получить этим алгоритмом большую точность надо обеспечить вычисления и хранение результатов с большей точностью. Тут встроенные типы не подойдут, придётся использовать специальные библиотеки или реализовывать подходящие типы и вычисления самостоятельно.
0
0 / 0 / 0
Регистрация: 18.03.2017
Сообщений: 24
18.03.2017, 23:28
grizlik78, нужна 1000 знаков. Можно подробнее про библиотеки и расширенные типы? Я читал про system.numeric и BigInteger с Complex, но что-то ничего не понял. Нуб, знаете ли.
И еще вопрос, есть ли более точный алгоритм? Вопрос стоит так, что при n=1000 выходит не совсем верное значение. вернее совсем не верное. Точных 8 знаков выходит только при n=1000000. остальные не проверял. Но и то, при таком количестве операций мой G3900 считает это минут 6, наверное.
Или все так и должно быть? (Не про время, а про совпадение числа с тем, что на википедии написано)

Извиняюсь за тупые вопросы, повторюсь, что я нуб, как в программировании так и в математике.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2017, 23:28
Помогаю со студенческими работами здесь

Нахождение суммы ряда с заданной точностью е
Помогите пожалуйста с задачей....вобще не знаю, что тут делать и как... Задача:составить алгоритм и программу нахождения суммы ряда с...

Нахождение суммы ряда с заданной точностью Е
Составить алгоритм и программу нахождения суммы ряда с заданной точкой Е. Использовать рекуррентные соотношения при вычислении очередного...

Нахождение суммы ряда с заданной точностью
Помогите решить задачу что то не как не могу определить с чего начать.

Исправить ошибку (нахождение суммы ряда с заданной точностью e)
С точностью 0.001 подсчитать сумму ряда \sum_{k=1}^{n}(-1)^kk/k!. Определить количество итераций. Вывести на печать: сумму ряда, количество...

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru