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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.86
Sobaka_ru
2 / 2 / 0
Регистрация: 16.12.2010
Сообщений: 75
#1

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

06.12.2011, 19:55. Просмотров 3022. Ответов 14
Метки нет (Все метки)

Нужна программа на C, вычисляющая число "ПИ" ну или хотя бы карказ ( с объяснением построчно, если можно )
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2011, 19:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление числа П (C++):

Вычисление числа Пи - C++
Составить на языке C программу, которая по введённому N возвращает N-ю после запятой десятичную цифру числа Пи. На работу программа...

Вычисление числа пи - C++
Короче, я полный ноль в СИ, и нужно решить такую задачку: Написать программу, которая вычисляет число «Пи» с заданной точностью...

Вычисление числа пи - C++
Всем доброго времени суток, подскажите как в моей программе получить более тысячи знаков после запятой при вычислении числа пи и записать...

Вычисление числа ПИ - C++
Помогите разобраться с заданием на языке C. http://dencom.nsknet.ru/_mod_files/ce_images/2009.png

Вычисление числа ПИ ( строки ) - C++
Добрый день, меня интересует каким образом вычислять число пи через строки. Т.е каким образом получают 2 трилиона знаков после запятой (...

Вычисление числа сочетаний из N по M - C++
Напишите программу для вычисления числа сочетаний из N по M. Число сочетаний определяется по формуле N!/(M!*(N-M)!, где N - количество...

14
-=ЮрА=-
Заблокирован
Автор FAQ
06.12.2011, 22:15 #2
Цитата Сообщение от Sobaka_ru Посмотреть сообщение
Нужна программа на C, вычисляющая число "ПИ" ну или хотя бы карказ ( с объяснением построчно, если можно )
- по этой ссылке много вариантов
Пи (число) — Википедия
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,273
Записей в блоге: 2
Завершенные тесты: 1
07.12.2011, 06:32 #3
самое простое:
C++
1
std::cout<<acos(-1.);
Добавлено через 1 минуту
если будет неоднозначность, то так:
C++
1
std::cout<<acos(double(-1));
0
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(); 
         
}
Мне скинули, только ниче тут не пойму... Если кто сможет объяснить, буду очень признателен
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
09.12.2011, 13:46 #5
Я предлагаю использовать отношение отношение площадей квадрата и круга и сеять точки рандомом по двум осям.
0
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;
}
3
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;
}
Вооо ) вот это более менее то )) немного понятно ))
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
10.12.2011, 14:17 #8
Первую эффективную формулу нашёл в 1706 году Джон Мэчин (англ. John Machin)
Разложив арктангенс в ряд Тейлора

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

Добавлено через 34 минуты
А на что влияет быстродействие на вычислиет??? Процессор????
0
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
Вычисление числа П  
Teravisor
31 / 31 / 3
Регистрация: 07.08.2011
Сообщений: 89
27.01.2012, 13:20 #13
Цитата Сообщение от Sobaka_ru Посмотреть сообщение
Что за ошибка???
Система не может определить использовать pow(float ...) или pow(double ...) - надо указать в лоб.
0
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);
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.03.2012, 10:20 #15
Цитата Сообщение от odip Посмотреть сообщение
Очень неточный метод и долго считать
Точность методов определяется временем расчёта, если считать долго, то все точные, монтекарло - не исключение.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2012, 10:20
Привет! Вот еще темы с ответами:

Вычисление факториала числа - C++
Маленькая программа вычисляет факториал числа, введенного пользователем, по формуле N! = N * (N – 1)!, где 0 != 1, и выводит его на экран. ...

Вычисление факториала числа N - C++
Что надо написать в пропущенной строке? setlocale(LC_ALL, &quot;Russian&quot;); int N; int P=1; cout&lt;&lt;&quot;Input N: &quot;; cin&gt;&gt;N; ...

Вычисление числа комбинаций - C++
Вопрос, конечно элементарный но сам запутался. Какое количество комбинаций можно получить из трех чисел. Вообщем похоже на бинарный код. ...

Вычисление факториала числа - C++
Написать программу, которая вычисляет факториал введенного с клавиатуры числа. (Факториалом числа n называется произведение целых чисел от...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
30.03.2012, 10:20
Ответ Создать тему
Опции темы

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