### c++

#### 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.

### Related Links

How does it pass lvalue reference to std::forward with CRTP?

Using lower_bound function in loop is giving runtime error?

Problems with rand(), always taking the same random generated number [duplicate]

Reading Credentials file fails with error 32

The mechanism of shared_ptr

C++ specialized function template

Compiler errors with cmath on Mac OS X

Array of fstream in C++

Error: (E107) bind interface to port failed: interface already bound to port: port 'MC8051_ALU().AM.port_27' (sc_in)

Error LINK2019 when I try to make a training for face detection [duplicate]

Quickest way to iterate in a C++ vector

How can I use snmp++ to enable/disable a switch port?

i wan't to use char* in this code instead of string how? [closed]

Using inRange() in OpenCV to detect colors in a range

The string.h 's function does not work in C++ but string does [on hold]

How to efficiently insert/merge into thrust::device_vector?