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

Вычисление числа П - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Sobaka_ru
2 / 2 / 0
Регистрация: 16.12.2010
Сообщений: 75
06.12.2011, 19:55     Вычисление числа П #1
Нужна программа на C, вычисляющая число "ПИ" ну или хотя бы карказ ( с объяснением построчно, если можно )
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
06.12.2011, 22:15     Вычисление числа П #2
Цитата Сообщение от Sobaka_ru Посмотреть сообщение
Нужна программа на C, вычисляющая число "ПИ" ну или хотя бы карказ ( с объяснением построчно, если можно )
- по этой ссылке много вариантов
Пи (число) — Википедия
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
07.12.2011, 06:32     Вычисление числа П #3
самое простое:
C++
1
std::cout<<acos(-1.);
Добавлено через 1 минуту
если будет неоднозначность, то так:
C++
1
std::cout<<acos(double(-1));
Sobaka_ru
2 / 2 / 0
Регистрация: 16.12.2010
Сообщений: 75
09.12.2011, 13:12  [ТС]     Вычисление числа П #4
А если так?
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <time.h> 
#include <stdio.h> 
#include <malloc.h> 
#include <math.h> 
#include <conio.h> 
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<n; i++) x[i] = 0; 
  x[0] = Integer; 
} 
/* 
** Is the big real x equal to zero ? 
*/ 
long IsZero (long n, long *x) { 
  long i; 
  for (i=0; i<n; i++)   
    if (x[i])   return 0; 
        return 1; 
} 
/* 
** 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]<B) carry = 0; 
    else { 
      carry = 1; 
      x[i] -= B; 
    } 
  }   
} 
/* 
** 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<n; i++) { 
    xi    = x[i]+carry*B; 
    q     = xi/d; 
    carry = xi-q*d;    
    y[i]  = q;         
  }   
} 
/* 
** 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<MaxDiv) 
      Div (n, uk, p2, uk);  /* 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; i<n; i++) { 
    printf ("%.4d", x[i]); 
    if (i%25==0) printf ("%8d\n", i*4); 
  } 
  printf ("\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; i<NbArctan; i++) { 
    arccot (p[i], size, arctan, buffer1, buffer2); 
    Mul (size, arctan, abs(m[i])); 
    if (m[i]>0) 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); 
        getch(); 
         
}
Мне скинули, только ниче тут не пойму... Если кто сможет объяснить, буду очень признателен
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.12.2011, 13:46     Вычисление числа П #5
Я предлагаю использовать отношение отношение площадей квадрата и круга и сеять точки рандомом по двум осям.
NEO*
14 / 14 / 1
Регистрация: 02.11.2011
Сообщений: 22
09.12.2011, 14:49     Вычисление числа П #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
можно ещё через ряд Лейбница:
1-1/3+1/5-1/7+1/9-1/11+...=П/4

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
#include <iostream>
#include <cmath>
using namespace std;
 
const int n=1000;//число элементов в сумме ряда
 
int main()
{
    double a[n];
    double Pi=0;
 
 
    for(int i=0;i<n;i++)
    {
        a[i]=pow(-1,i)/(2*i+1);
    }
 
    for(int i=0;i<n;i++)
    {
        Pi+=4*a[i];
    }
    cout<<"Pi="<<Pi<<endl;
 
    return 0;
}
Sobaka_ru
2 / 2 / 0
Регистрация: 16.12.2010
Сообщений: 75
10.12.2011, 12:59  [ТС]     Вычисление числа П #7
Цитата Сообщение от NEO* Посмотреть сообщение
можно ещё через ряд Лейбница:
1-1/3+1/5-1/7+1/9-1/11+...=П/4

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
#include <iostream>
#include <cmath>
using namespace std;
 
const int n=1000;//число элементов в сумме ряда
 
int main()
{
    double a[n];
    double Pi=0;
 
 
    for(int i=0;i<n;i++)
    {
        a[i]=pow(-1,i)/(2*i+1);
    }
 
    for(int i=0;i<n;i++)
    {
        Pi+=4*a[i];
    }
    cout<<"Pi="<<Pi<<endl;
 
    return 0;
}
Вооо ) вот это более менее то )) немного понятно ))
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
10.12.2011, 14:17     Вычисление числа П #8
Первую эффективную формулу нашёл в 1706 году Джон Мэчин (англ. John Machin)
Разложив арктангенс в ряд Тейлора

читайте http://ru.wikipedia.org/wiki/%D0%9F%...81%D0%BB%D0%BE) там и формула вычисления арктангенса через ряд Тейлора есть
Sobaka_ru
2 / 2 / 0
Регистрация: 16.12.2010
Сообщений: 75
27.01.2012, 12:00  [ТС]     Вычисление числа П #9
Что за ошибка???
Миниатюры
Вычисление числа П  
odip
Эксперт C++
 Аватар для odip
7226 / 3288 / 59
Регистрация: 17.06.2009
Сообщений: 14,165
27.01.2012, 12:13     Вычисление числа П #10
Я предлагаю использовать отношение отношение площадей квадрата и круга и сеять точки рандомом по двум осям.
Очень неточный метод и долго считать
Sobaka_ru
2 / 2 / 0
Регистрация: 16.12.2010
Сообщений: 75
27.01.2012, 12:49  [ТС]     Вычисление числа П #11
А как написать тогда прогу?? Я хочу с наименьшем обьемом и понятную. Желательно с комментами

Добавлено через 34 минуты
А на что влияет быстродействие на вычислиет??? Процессор????
-=ЮрА=-
Заблокирован
Автор FAQ
27.01.2012, 13:12     Вычисление числа П #12
Sobaka_ru, ещё во 2-м посте дал ссылку как считать
Вот например ряд Лейбница для вычисления pi/4
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
#include <iostream>
using namespace std;
 
int main()
{
    long i = 1;
    //ГђГїГ¤ ËåéáГ*ГЁГ¶Г*:
    double ai = 1 - 1.0/3;
    double pi = 0;
    double err;
    while(true)
    {
        cout<<"Enter error of calculations : ";
        cin>>err;
        for(i = 2; err <= ai; i += 2)
        {
            pi += ai;
            ai = 1.0/(2*i + 1) - 1.0/(2*i + 3);
            //ГђГ*ñêîìåГ*òèðîâГ*ГІГј åñëè ГҐГ±ГІГј æåëГ*Г*ГЁГҐ ñìîòðåòü äðîáè
            //system("cls");
            //cout<<"1/"<<(2*i + 1)<<" - 1/"<<(2*i + 3)<<endl;
        }
        //cout<<"Error of calculations : "<<err<<endl;
        cout<<"pi = "<<pi*4<<endl;
    }
    return 0;
}
Миниатюры
Вычисление числа П  
Teravisor
30 / 30 / 3
Регистрация: 07.08.2011
Сообщений: 89
27.01.2012, 13:20     Вычисление числа П #13
Цитата Сообщение от Sobaka_ru Посмотреть сообщение
Что за ошибка???
Система не может определить использовать pow(float ...) или pow(double ...) - надо указать в лоб.
doc_93
0 / 0 / 0
Регистрация: 30.03.2012
Сообщений: 3
30.03.2012, 00:47     Вычисление числа П #14
Цитата Сообщение от Sobaka_ru Посмотреть сообщение
Что за ошибка???
Напиши a[i]=pow(-1.0,i)/(2*i+1);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2012, 10:20     Вычисление числа П
Еще ссылки по теме:

C++ Вычисление точности числа
Вычисление числа ПИ ( строки ) C++
Вычисление числа комбинаций C++
Вычисление числа пи C++
Вычисление факториала числа N C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2012, 10:20     Вычисление числа П #15
Цитата Сообщение от odip Посмотреть сообщение
Очень неточный метод и долго считать
Точность методов определяется временем расчёта, если считать долго, то все точные, монтекарло - не исключение.
Yandex
Объявления
30.03.2012, 10:20     Вычисление числа П
Ответ Создать тему
Опции темы

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