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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Окно Windows/Linux на с++ без всяких api http://www.cyberforum.ru/cpp/thread157796.html
Основная суть вопроса в заголовке.теперь пояснения. Как сделать окно на чистом С++без всяких opengl,winapi просто имея Пакет языка с++ и нечего больше со стандартными библами.я сразу думаю что этот...
C++ Динамически изменяющаяся строка Есть файл, который постоянно меняется.. Я его читаю так допустим: int main() { while(1) { system("clear"); system("cat /home/alexey/Desktop/log.txt"); http://www.cyberforum.ru/cpp/thread157701.html
Указатель на пользовательский тип C++
Чёто туплю, почему когда передаёшь переменную (например int) параметром через адрес в функцию (параметр - указатель на этот тип), то в теле этой функции для доступа к этой переменной приходится...
Распараллеливание программы C++
Пишу брутер и встал вопрос о добавление многопоточности. Вот у меня есть функция: std::string wbfunc(std::string& hash) { std::string line; std::ifstream f("/home/hromjo/d"); while...
C++ Обработка кнопки http://www.cyberforum.ru/cpp/thread157125.html
У меян есть вот такая идея!я решил написать небольшую программку куда пользователь будет вводить свой майл и свой пароль потом при нажатии на клавишу данные будут сохраняться в файл,вот все что я...
C++ Нужен пример перехвата API функции на Detours!!! В долгих поисках пришел к выводу использовать Detours для отлова пакетов. Где можно найти рабочий исходник отлова какой-нибудь функции (желательно Send/Recv)? подробнее

Показать сообщение отдельно
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru