2016-02-24 3 views
0

Я пытаюсь аппроксимировать pi с помощью цикла for. Пользователь вводит количество итераций n, и программа должна получать все большее значение начисления для pi с каждой дополнительной итерацией. У меня есть вложенная структура управления "if", которая проверяет, является ли "i" четным или нечетным. Однако, когда мой цикл повторяется после первого запуска, мое значение для pi не меняется. Pi остается на уровне 1 в контуре, а конечный выход равен 4. Я должен использовать ряд приближений:Оценка pi с C++ для цикла

pi = 4 [1 - 1/3 + 1/5 + ... + 1/(2n- 1) + 1/(2n + 1)].

Что я делаю неправильно?

int _tmain(int argc, _TCHAR* argv[]) 
{ 

double pi = 0; 
long i; 
int n; 

cout << "Enter the value of n: "; //prompt for input 
cin >> n;       //store input in "n" 
cout << endl;      //end line 

for (i = 0; i < n; i++) 
{ 
    if (i % 2 == 0)      //if even 
     pi = pi + (1/(2 * i + 1)); 
    else        //if odd 
     pi = pi - (1/(2 * i + 1)); 
} 

pi = 4 * pi;       //multiply by 4 

cout << endl << "pi = " << pi << endl; //display result 

system("Pause"); //pause program 
return 0;   //close program 
+4

Integer division.'x/y' является '0' для пары целых чисел с' x Zeta

+0

Некоторые вещи кода: а) Не привыкайте к этому '_t', лучше забудьте об этом полностью. б) Отступы. – deviantfan

+0

На основе приведенной серии примеров цикл for должен быть | для (i = 0; i <= n; i ++) | , Было бы немного более точным, если бы вы сделали меньшие числа в первую очередь: | для (i = n; i> = 0; i--) | , – rcgldr

ответ

0

Проблема заключается в использовании ints при расчете числа с плавающей точкой. Читайте об этом здесь: Why can't I return a double from two ints being divided

Таким образом, чтобы избежать этого нужно сделать математику с числами с плавающей точкой:

pi = pi + (1.0/(2.0 * i + 1.0)); 

На самом деле это хорошая идея, чтобы всегда четко указать, когда вы собираетесь использовать с плавающей точкой , даже если это не является необходимым:

const float pi_real = 3.14159; 
const float one = 1.0; 

Это делает ваше намерение понятным и позволяет избежать таких ошибок. Here is a live example.

+0

Большое вам спасибо! Это убило меня. –