

Не могу написать код для вычисления числа ПИ с заданной точностью используя формулу Валлиса
что тут можно добавить убрать?
#include <iostream>
#include <stdio.h>
#include <cmath>
int main()
{
using namespace std;
double pi = 1, x;
double i = 0, eps;
cin >> eps;
for (;;i++)
{
x = pow(2 * i, 2) / ((2 * i - 1) * (2 * i + 1));
if (abs(x) > eps)
break;
pi = pi * x;
}
pi = 2 * pi;
printf("pi = %lg, i = %d", pi, i);
return 0;
}
#include <iostream>
int main()
{
using namespace std;
double pi = 1, x, pi_prev = 1, eps;
size_t i = 1, cf = 10;
cin >> eps;
for (;; i++)
{
x = pow(2 * i, 2) / ((2 * i - 1) * (2 * i + 1));
pi = pi * x;
if (i % cf == 0) { if (pi - pi_prev < eps) break; pi_prev = pi; cf *= 3; }
}
pi = 2 * pi;
cout << pi;
return 0;
}
Этот алгоритм имеет очень медленную сходимость, поэтому не подходит для вычисления пи с заданной точностью. Присобачил костыль который имитирует проверку на точность как хромая собака танцует.
У вас x - это коэфициент, а еps абсолютная величина, напрямую сравнивать не получится.
А операция инкремента ++ разве применима к типу double?
Ну и вот это условие, разумеется, неверное:
if (abs(x) > eps)
В остальном выглядит вполне кошерно.
abs(x) должен быть < eps.
А вообще, можно было бы использовать while-цикл.
Мало что там Валлис придумал.
Есть реалии компилятора.
Вот такой работает
...
double pi = 1, x;
double i;
for (i = 1.0; i<2000;i++)
{
pi *= 4*i*i/(4*i*i-1);
}
pi = 2 * pi;
...
но сходимость да, очень плохая