Function for calculating Pi using taylor series in c++

So I'm at a loss on why my code isn't working, essentially the function I am writing calculates an estimate for Pi using the taylor series, it just crashes whenever I try run the program.

here is my code

#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;

double get_pi(double accuracy)
{
double estimate_of_pi, latest_term, estimated_error;
int sign = -1;
int n;

estimate_of_pi = 0;
n = 0;

do
{
    sign = -sign;
    estimated_error = 4 * abs(1.0 / (2*n + 1.0));  //equation for error
    latest_term = 4 * (1.0 *(2.0 * n + 1.0));      //calculation for latest term in series
    estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
    n = n + 1;                                     //changing value of n for next run of the loop
}
while(abs(latest_term)< estimated_error);

return get_pi(accuracy);

}

int main()
 {
    cout << get_pi(100);
 }

the logic behind the code is the following:

  • define all variables
  • set estimate of pi to be 0
  • calculate a term from the taylor series and calculate the error in this term
  • it then adds the latest term to the estimate of pi
  • the program should then work out the next term in the series and the error in it and add it to the estimate of pi, until the condition in the while statement is satisfied
  • Thanks for any help I might get


    There are several errors in your function. See my comments with lines starting with "//NOTE:".

    double get_pi(double accuracy)
    {
       double estimate_of_pi, latest_term, estimated_error;
       int sign = -1;
       int n;
    
       estimate_of_pi = 0;
       n = 0;
    
       do
       {
          sign = -sign;
    
          //NOTE: This is an unnecessary line.
          estimated_error = 4 * abs(1.0 / (2*n + 1.0));  //equation for error
    
          //NOTE: You have encoded the formula incorrectly.
          // The RHS needs to be  "sign*4 * (1.0 /(2.0 * n + 1.0))"
          //                       ^^^^          ^
          latest_term = 4 * (1.0 *(2.0 * n + 1.0));      //calculation for latest term in series
          estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
          n = n + 1;                                     //changing value of n for next run of the loop
       }
    
       //NOTE: The comparison is wrong.
       // The conditional needs to be "fabs(latest_term) > estimated_error"
       //                              ^^^^             ^^^
       while(abs(latest_term)< estimated_error);
    
       //NOTE: You are calling the function again.
       // This leads to infinite recursion.
       // It needs to be  "return estimate_of_pi;"
       return get_pi(accuracy);    
    }
    

    Also, the function call in main is wrong. It needs to be:

    get_pi(0.001) 
    

    to indicate that if the absolute value of the term is less then 0.001, the function can return.

    Here's an updated version of the function that works for me.

    double get_pi(double accuracy)
    {
       double estimate_of_pi, latest_term;
       int sign = -1;
       int n;
    
       estimate_of_pi = 0;
       n = 0;
    
       do
       {
          sign = -sign;
          latest_term = sign * 4 * (1.0 /(2.0 * n + 1.0));  //calculation for latest term in series
          estimate_of_pi += latest_term;                    //adding latest term to estimate of pi
          ++n;                                              //changing value of n for next run of the loop
       }
       while(fabs(latest_term) > accuracy);
    
       return estimate_of_pi;
    }
    

    Your return statement may be the cause.

    Try returning "estimate_of_pi" instead of get_pi(accuracy).


    Your break condition can be rewritten as

    2*n + 1 < 1/(2*n + 1)     =>   (2*n + 1)^2 < 1
    

    and this will never be true for any positive n . Thus your loop will never end. After fixing this you should change the return statement to

    return estimated_error;
    

    You currently are calling the function recursively without an end (assuming you fixed the stop condition).

    Moreoever you have a sign and the parameter accuracy that you do not use at all in the calculation.

    My advice for such iterations would be to always break on some maximum number of iterations. In this case you know it converges (assuming you fix the maths), but in general you can never be sure that your iteration converges.

    链接地址: http://www.djcxy.com/p/12246.html

    上一篇: 使用jquery检查/取消选中复选框?

    下一篇: 在c ++中使用泰勒级数计算Pi的函数