Задача: Сравнить скорость сходимости (число слагаемых для заданной точности [latex]e[/latex] следующих разложений числа [latex]\pi[/latex]
1. [latex]\pi=4\left(1-\frac {1}{3}+\frac {1}{5}-\frac {1}{7}+\frac {1}{9} -… \right)[/latex]
2. [latex]\pi=3+4\left(\frac {1}{2\cdot 3\cdot 4}-\frac {1}{4\cdot 5\cdot 6}+\frac {1}{6\cdot 7\cdot 8\cdot } -…\right)[/latex]
3. [latex]\pi=\sqrt {6\left(1+\frac {1}{ {2}^{2} } +\frac {1}{ {3}^{2}}+\frac {1}{ {4}^{2}}+… \right) }[/latex]
Число слагаемых (е) | Вариант 1 | Вариант 2 | Вариант 3 | Комментарий |
1 | 0.858407 | 0.025074 | 0.692103 | Работает |
2 | 0.474926 | 0.00825932 | 0.40298 | Работает |
3 | 0.325074 | 0.00825932 | 0.283855 | Работает |
10 | 0.099753 | 0.000185935 | 0.092231 | Работает |
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 |
#include <iostream> #include <cmath> using namespace std; struct bolshoe() double minimum( double a, double b ) { // почему-то min и max не хотели работать return a < b ? a : b; // на идеоне, я не стал разбираться. } double maximum( double a, double b ) { return a > b ? a : b; } int main() { double vara = 0, varb = 0, varc = 0, difa = 0, difb = 0, difc = 0; // dif - difference int e; // e - кол-во слагаемых scanf("%d", &e); for(int i = 1, sign; i <= e; i++){ // складываем слагаемые sign = i % 2? 1:-1; vara += 1 / ((i * 2.0) - 1) * sign; varb += 1 / ((i * 2.0) * ((i * 2.0) + 1) * ((i * 2.0) + 2)) * sign; varc += 1 / pow(i, 2); } vara = 4 * vara; varb = 3 + (4 * varb); varc = sqrt(6 * varc); // строка внизу считает погрешность difa = fabs(M_PI - vara); difb = fabs(M_PI - varb); difc = fabs(M_PI - varc); printf("%lg - самая маленькая погрешность\n", minimum(difa, minimum(difb, difc))); // вывод printf("%lg - самая большая погрешность\n", maximum(difa, maximum(difb, difc))); printf("1 = %lg\n2 = %lg\n3 = %lg", difa, difb, difc); return 0; } |
Первым делом я исчисляю разложения с заданным количеством слагаемых. Затем я присваиваю нужные им значения (по формуле), а затем с помощью абсолютного значения числа считаю погрешность.
Вывод: Второе разложение является самым точным.
По поводу min и max: Вам нужно было подключить содержащую их библиотеку. Скорее всего, проблему решит #include
Теги коварны.
#include algorithm
В угловых скобочках.
Тег «pre» помогает бороться с коварством угловых скобок:
Добавлю:
— Если нужно менять знак для чётных и нечетных слагаемых, то лучше завести переменную sign = i % 2? -1: 1. А в нужном месте на неё домножать. Переписывать длинные формулы по два раза с разными знаками методически неверно.
— Ещё одна методическая ошибка. Нужно сначала вычислить приближённые значения пи по каждой из формул и только потом находить погрешность. Если сразу считать погрешность, то можно допустить ошибку и даже её не заметить. Что и произошло со второй формулой — погрешность считается неверно.
По оформлению.
Для создания списков есть теги ol, ul и li. В редакторе есть соответствующие кнопки. Не стоит нумеровать всё в ручную.
Учёл и исправил. Что по поводу библиотеки algorithm. Я про неё знаю, и даже если бы не знал, то гугл бы точно подсказал. Дело в том, что идеон не хочет ей пользоваться по непонятным мне причинам. Поэтому я решил просто вставить эти компараторы самому.
Если можно, то объясните, пожалуйста, в чем проблема с библиотекой. Сталкиваюсь не впервые. http://ideone.com/fork/wdIRRT — вариант кода с библиотекой.
Вы ошибаетесь, проблем на ideone с <algorithm> нет.
Взгляните.
В Вашем коде min(a,b) и max(a,b) вызываются с тремя аргументами. Если ещё где-то обнаружите проблему пишите.
Зачтено.