Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+1

Не могу написать код для вычисления числа ПИ с заданной точностью используя формулу Валлиса

что тут можно добавить убрать?
#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;
}

По дате
По рейтингу
Аватар пользователя
Новичок
123456789101112131415161718
 #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-цикл.

Аватар пользователя
Мыслитель

Мало что там Валлис придумал.
Есть реалии компилятора.

Аватар пользователя
Мыслитель

Вот такой работает

123456789
 ...
        double pi = 1, x;  
        double i;  
        for (i = 1.0; i<2000;i++)  
        {  
                pi *= 4*i*i/(4*i*i-1);  
        }  
        pi = 2 * pi;  
... 

но сходимость да, очень плохая