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

Рассчитать значение п на основании бесконечного ряда - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
fs444
6 / 10 / 0
Регистрация: 18.08.2009
Сообщений: 480
19.02.2010, 08:12     Рассчитать значение п на основании бесконечного ряда #1
У Дейтлов есть задача:
Рассчитайте значение п на основании бесконечного ряда
п 4 4/3 4/5 4/7 4/9 4/11
Напечатайте таблицу, которая покажет, как значение п аппроксимируется одним членом этого ряда, двумя членами, тремя и тд. Сколько членов ряда потребовалось для получения значения 3.14? 3.141? 3.1415? 3.14159?
Это программа должна вывести
п = 4 + 4/3 = 4*(4/3) = 16/3
16/3 * 4/5 = 48/15 и т.д.?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2010, 08:12     Рассчитать значение п на основании бесконечного ряда
Посмотрите здесь:

C++ Сумма бесконечного ряда
вычисление суммы бесконечного ряда C++
C++ Нахождение бесконечного ряда с точностью
C++ Вычисления бесконечного ряда
C++ Сумма бесконечного ряда с факториалом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fs444
6 / 10 / 0
Регистрация: 18.08.2009
Сообщений: 480
25.02.2010, 08:23  [ТС]     Рассчитать значение п на основании бесконечного ряда #2
Вот я нашел формулу
1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... = П/4

А Дейтлы имеют в виду
4 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + ... = П

Я правильно понимаю?

Добавлено через 21 час 29 минут
Написал код
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
#include <iostream>
#include <cmath>
#include<cstring>
#include <iomanip>
using namespace std;
 
int main()
{
   double p = 4;// значение Пи
   int delim = 4;// делимое
   int delit = 3;// делитель
   int chlenR = 1;// член ряда
 
   cout << "PI" << setw(20) << "Chlen" << endl;
   cout << "4" << setw(20) << "4 / 1" << endl;
 
   for (int i = 0; i < 10; i++)
//   while (p != 3.14159)
   {
      if (chlenR % 2 != 0)
      {
         p += delim / delit;
 
         cout << p << setw(20) << delim << " / " << delit << " = " << delim / delit << endl;
 
         delit +=2;
         chlenR++;
      }
      else
      {
         p -= delim / delit;
 
         cout << p << setw(20) << delim << " / " << delit << " = " << delim / delit << endl;
 
         delit +=2;
         chlenR++;
      }
   }
 
   system("pause");
   return 0;
}
Но почему то все члены начиная с 4/5 равны 0. Соответственно, и ПИ не меняется. В чем дело? С типами переменных напутал?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
25.02.2010, 13:16     Рассчитать значение п на основании бесконечного ряда #3
Цитата Сообщение от fs444 Посмотреть сообщение
C++
1
p += delim / delit;
C++
1
p += delim / (double)delit;
или
C++
1
p += delim / static_cast<double>(delit);
fs444
6 / 10 / 0
Регистрация: 18.08.2009
Сообщений: 480
25.02.2010, 14:48  [ТС]     Рассчитать значение п на основании бесконечного ряда #4
Так, деление получилось.

Идем дальше. В задании сказано, что нужно найти количество членов ряда, при которых ПИ будет равно 3.14159.

Я исправил код так:
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
#include <iostream>
#include <cmath>
#include<cstring>
#include <iomanip>
using namespace std;
 
int main()
{
   double p = 0;// значение Пи
   int delim = 4;// делимое
   int delit = 1;// делитель
   int chlenR = 1;// член ряда
 
   cout << "PI" << setw(20) << "Slagaemoe" << endl;
//   cout << "4" << setw(20) << "4 / 1" << endl;
 
//   for (int i = 0; i < 3000; i++)
   while (p != 3.14159)
   {
      if (chlenR % 2 != 0)
      {
         p += delim / (double)delit;
 
         cout << p << setw(20) << delim << " / " << delit << endl;
 
         delit +=2;
         chlenR++;
      }
      else
      {
         p -= delim / (double)delit;
 
         cout << p << setw(20) << delim << " / " << delit << endl;
 
         delit +=2;
         chlenR++;
      }
   }
 
   system("pause");
   return 0;
}
И заметил, что значение ПИ циклично перебирается между несколькими числами, и как оно тогда дойдет до нужной мне 3.14159?
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
25.02.2010, 16:17     Рассчитать значение п на основании бесконечного ряда #5
вместо
C++
1
while (p != 3.14159)
C++
1
while (fabs(p - 3.14159)>5e-6)
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
16.03.2015, 15:20     Рассчитать значение п на основании бесконечного ряда #6
Так, а может пояснить кто,написал код этой программы,программа считает пи,но цикл не завершается все равно,она продолжает считать дальше.Почему так?
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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <math>
#include <iomanip>
 
using namespace std;
 
int main()
{
        double pi=0;
        double x=4;
        int a=1,b=1;
        while(pi!=3.14159)
        {
          if(b%2!=0)
           {
           pi+=x/a;
           a+=2;
           b++;
           }
          else
            {
            pi-=x/a;
            a+=2;
            b++;
            }
         cout << setprecision(5) << fixed  << pi << "   -   " << b <<endl;
        }
        system("pause");
        return 0;
}
3.14159 - получается где-то на 130658 итерации,но программа не завершает цикл. Можно конечно в цикле while просто изменить условие на while(b<=130660) и просто увидеть конец где получается 3.14159,но просто интересно почему так
Yandex
Объявления
16.03.2015, 15:20     Рассчитать значение п на основании бесконечного ряда
Ответ Создать тему
Опции темы

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