Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/41: Рейтинг темы: голосов - 41, средняя оценка - 4.68
0 / 0 / 1
Регистрация: 04.05.2010
Сообщений: 112

Как просчитать число ПИ до определенного знака?

06.08.2010, 23:26. Показов 7772. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите удобную формулу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.08.2010, 23:26
Ответы с готовыми решениями:

Обрезать (не округлить) число до определенного знака после запятой
подскажите как обрезать число до определённого знака - не округлить, а обрезать. 1.555666 в итоге чтобы получить 1.555 что-то с trunc?

Как получить часть строки до определенного знака
Всем Здравствуйте! Прошу знатоков о помощи. Есть строка, разделенная ";" - "Строка1; Строка2; Строка3; и т.д.". Можно ли из этой...

Как найти количество символов в строке до определённого знака?
есть много разных строк. как в них найти количество символов до определенного знака? в моем случае до : понимаю, что нужен цикл ...

7
Эксперт С++
 Аватар для Хохол
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.08.2010, 23:33
ru.wikipedia.org/wiki/Число_пи
Выбирайте по вкусу формулу, считайте по ней с нужной точностью.
0
 Аватар для abiprofi
48 / 48 / 7
Регистрация: 04.08.2010
Сообщений: 110
06.08.2010, 23:37
Если речь идет об округлении до определенного знака, то примерно так:
Объявление функции:
C++
1
double __fastcall DRound(double Argument, int Precision);
Реализация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
double __fastcall TForm1::DRound(double Argument, int Precision)
{
//Точность может быть отрицательной. Dround(1234,-2) = 1200.
 double Divisor  = 1.0;
 if(Precision >= 0)
  while(Precision--)
   Divisor *= 10.0;
 else
  while(Precision++)
   Divisor /= 10.0;
 return floor(Argument * Divisor + 0.5) / Divisor;
}
А формулы предложены абсолютно верно господином "Хохол"!
0
0 / 0 / 1
Регистрация: 04.05.2010
Сообщений: 112
06.08.2010, 23:38  [ТС]
Где я тут ошибся:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
__int64 leng=2;
    long double f4=4,f3=3;
    long double result=f4/f3,del=5;
    for(int i=0;i<leng;i++)
    {
        result=result+f4/del;
        del=del+2;
        result=result-f4/del;
        del=del+2;
    }
    long double x=4;
    cout<<x-result;
    getch();
?
0
 Аватар для abiprofi
48 / 48 / 7
Регистрация: 04.08.2010
Сообщений: 110
07.08.2010, 00:28
Положить 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

Добавлено через 37 минут
Вот вспомнил. Код ни в коем случае не мой. Программист - француз Pascal Sebah.
Вычисляем первые NbDigits цифр числа Pi(в данном случае 10000). Используется рекурсия.
Время вычисления у меня на машине - меньше 1 с.
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
#include <time.h>
#include <stdio.h>
#include <malloc.h>
#include <math.h>
 
long B=10000; 
long LB=4;    
long MaxDiv=450;  
 
void SetToInteger (long n, long *x, long Integer) {
  long i;
  for (i=1; i<n; i++) x[i] = 0;
  x[0] = Integer;
}
 
long IsZero (long n, long *x) {
  long i;
  for (i=0; i<n; i++)  
    if (x[i])   return 0;
        return 1;
}
 
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;
    }
  }  
}
 
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]--;
      }
                }
  }  
}
 
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;
        }  
}
 
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;        
  }  
}
 
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);  /* Первый шаг уменьшает p */
    else {
      Div (n, uk, p, uk);   /* Второй увеличивает p */
      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;
  }
}
 
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");
}
 
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();    
  /*
  ** Используем: 
  ** Pi/4 = 12*arctan(1/18)+8*arctan(1/57)-5*arctan(1/239) (Гаусс)  
  **   
  */
  NbArctan = 3;
  m[0] = 12; m[1] = 8;  m[2] = -5;
  p[0] = 18; p[1] = 57; p[2] = 239; 
  SetToInteger (size, Pi, 0);
  /*
  ** Вычисляем 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);  /* Печатаем Pi */
  printf ("Time is : %9.2f seconds\n",  
         (float)(endclock-startclock)/(float)CLOCKS_PER_SEC ); 
  free (Pi);
  free (arctan);
        free (buffer1);
        free (buffer2);
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
07.08.2010, 00:37
_nic, а чем Вас константа M_PI из math.h не устроила?
Code
1
2
$ grep PI /usr/include/math.h
#define M_PI            3.14159265358979323846
0
0 / 0 / 1
Регистрация: 04.05.2010
Сообщений: 112
07.08.2010, 11:14  [ТС]
Помню была такая программа которая бенчила проц путем просчета пи,вот мне так и нада нагрузить процессор.Каким нибудь ресурсоемким мат. вычислением.
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
07.08.2010, 16:28
_nic, Вот:
C++
1
2
3
4
5
6
7
8
#include <iostream>
#include <limits>
int main(){
    for(int i = numeric_limits<int>::min(); i < numeric_limits<int>::max();++i)
        for(int j = numeric_limits<int>::min(); j < numeric_limits<int>::max();++j)
            for(int k = numeric_limits<int>::min(); k < numeric_limits<int>::max();++k)
    return 0;
}
Обычный процессор, под win32 будет больше часа загружен на всю катушку

Добавлено через 9 минут
Не желательно проверять именно этот код, можно поставить цикл на 1000000 и посмотреть время выполнения, это будет где-то секунда, потом разделить (4294967295)^3 / 1000000 и получите время в секундах, которое ваш процессор точно не будет отдыхать

Добавлено через 1 час 34 минуты
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <limits>
#include <iomanip>
#include <ctime>
 
using namespace std;
 
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef long long LL;
 
#define FOR(i,a,b) for (int i(a), _n(b); i < _n; ++i)
#define MIN(a,b) ( (a) < (b) ? a : b )
#define MAX(a,b) ( (a) > (b) ? a : b )
#define ALL(a) a.begin(), a.end()
 
const LL base = 1000*1000;
 
VI operator - (VI, VI);
VI operator -= (VI &, VI);
VI operator + (VI, VI);
VI operator * (const VI, VI);
VI operator * (VI, const int);
VI operator / (VI, const int);
ostream &operator << (ostream &, VI);
 
int main(){
    VI a(2); a[0] = 967295, a[1] = 4294;
 
    time_t begin = clock();
    FOR(i,0,1000*1000*1000) continue;
    time_t end = clock();
    int total_time = end - begin;
 
    VI miliseconds = a*a*a*total_time/(1000*1000*1000), // здесь все верно
       hours = miliseconds / (1000 * 60 * 60),
       minutes = (miliseconds - hours * (1000 * 60 * 60)) / (1000 * 60),
       seconds = (miliseconds - hours * (1000 * 60 * 60) - minutes * (1000 * 60)) / 1000;
    miliseconds -= hours * (1000 * 60 * 60) + minutes * (1000 * 60) + seconds * 1000;
 
    cout << "Time of following code:\n"
            "for(int i = numeric_limits<int>::min(); i < numeric_limits<int>::max();++i)\n\t"
            "for(int j = numeric_limits<int>::min(); j < numeric_limits<int>::max();++j)\n\t\t"
            "for(int k = numeric_limits<int>::min(); k < numeric_limits<int>::max();++k))\n";
    cout << "Is: [" << hours << "] hours [" << minutes << "] minuts [" << seconds << 
        "] seconds [" << miliseconds << "] miliseconds\n";
    return 0;
}
 
VI operator - (VI a, VI b){
    for (int i = 0, carry = 0; i < b.size() || carry; ++i){
        a[i] -= carry + (i < b.size() ? b[i] : 0);
        carry = a[i] < 0;
        carry ? a[i] += base : 0;       
    }
    while (!a.back() && a.size() > 1) a.pop_back();
    return a;
}
 
VI operator -= (VI &a, VI b){
    a = a - b;
    return a;
}
 
VI operator + (VI a, VI b){
    for (int i = 0, carry = 0; i < MAX(a.size(),b.size()) || carry; ++i){
        if (i == a.size()) a.push_back(0);
        a[i] += carry + (i < b.size() ? b[i] : 0);
        carry = a[i] >= base;
        carry ? a[i] -= base : 0;
    }
    while (!a.back() && a.size() > 1) a.pop_back();
    return a;
}
 
VI operator * (const VI a, VI b){
    VI res(a.size() + b.size(), 0);
    for (int i = 0, carry = 0; i < a.size(); ++i){
        for (int j = 0; j < b.size() || carry; ++j){
            if (j == b.size()) b.push_back(0);
            LL cur = a[i]*1ll*b[j] + carry + res[i+j];
            res[i+j] += cur % base;
            carry = cur / base;
        }
    }
    while (!res.back() && res.size() > 1) res.pop_back();
    return res;
}
 
VI operator * (VI a, const int b){
    for (int i = 0, carry = 0; i < a.size() || carry; ++i){
        if (i == a.size()) a.push_back(0);
        LL cur = a[i] * 1ll * b + carry;
        a[i] = cur % base;
        carry = cur / base;
    }
    while (!a.back() && a.size() > 1) a.pop_back();
    return a;
}
 
VI operator / (VI a, const int b){
    for (int i = a.size()-1, carry = 0; i > -1; --i){
        LL cur = a[i] + carry*1ll*base;
        a[i] = cur / b;
        carry = cur % b;
    }
    while(!a.back() && a.size() > 1) a.pop_back();
    return a;
}
 
ostream &operator << (ostream &out, VI a){
    out << (a.empty() ? 0 : a.back());
    for (int i = a.size()-2; i > -1; --i) out << setfill('0') << setw(6) << a[i];
    return out;
}
Эта программа за 3 секунды вам покажет время выполнение вышеприведенного кода.

Добавлено через 18 минут
Касательно вычисления числа Пи, то метода быстрее за формулу Джона Мэчина я не видел. Ее вы можете посмотреть в вики по ссылке, что дал Хохол. И даже не пытайтесь находить число Пи в даблах - очень низкая точность, лучше пишите длинную арифметику на дробных числах, или используйте cmath.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2010, 16:28
Помогаю со студенческими работами здесь

Как обеспечить вывод числа с точностью до определённого знака?
Нужно вычислить выражение в Delphi с определённой точностью. Каким образом обеспечить желаемую точность, например 0,01.

Удаление текста до определенного знака
Ребят, подскажите пожалуйста: есть много текста в ячейках, в каждом тексте есть разные фразы и разной длины, но всегда в каждом тексте...

Возврат строки до определенного знака
Есть столбец (String) в котором такие значение &quot;20/34/45 &quot;, &quot;34/5/122&quot; и т.д. Как мне выбрать значение строки до первого слэша...

Ограничение числа до определенного знака
Дано задание вывести число, с точностью до E=0.00001. Это значит что надо обрубить цифры после 5 знака после запятой, или как?

Округление числа . FF.1F9A6B51 (16) до определенного знака
Есть дробное число допустим 255,12345 перевести его в 16 систему это будет FF.1F9A6B51 .. и после округлить до определенного знака.......


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru