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?

Categories

HOME
highcharts
google-maps-api-3
jsoup
masonry
modularity
google-places-api
jboss-eap-6
pymc
ieee
ccache
strongloop
m3u8
prefix
biopython
smt
markup
pyvmomi
multiline
mysql-error-1064
qtspim
packet-capture
google-cloud-vision
entity-relationship
avaya
android-appbarlayout
maxlength
coupon
neoscms
hp-quality-center
bluehost
android-adapter
lsmeans
layer
dexguard
war
oracle-data-modeler
notnull
jenkinsfile
android-device-monitor
libphonenumber
auto-value
grunt-string-replace
dwt
evosuite
rt
appharbor
tivoli-identity-manager
javac
webpack-style-loader
graylog
dependency-properties
live-connect-sdk
android-build
ucos
ngdoc
maven-resources-plugin
bubble-sort
libtool
munin
jake
sonarqube-4.5
aide-ide
twebbrowser
plone-4.x
ubuntu-15.10
ienumerable
android-selector
anonymity
inventory
dfdl
couchbase-sync-gateway
android-6.0.1
httpful
zurb-foundation-5
stompjs
custom-taxonomy
wordpress-4.5
tstringgrid
xamarin-forms
github-linguist
nstablecolumn
protractor-net
aloha-editor
cloudcontrol
reagent
eazfuscator
mashape
srv
slab
file-attributes
ember-testing
networkcredentials
curator
kindle-fire
resharper-plugins
n-tier
firstdata
bonjour
phpmotion
django-1.2
commission-junction
ubuntu-13.04
panning
iunknown
opengl-es-1.1
capability
robohelp
incompatibletypeerror
iphone-4
ctime
getprocaddress
testdriven.net
flotr
incremental-linking
html-rendering
trackback
task-tracking
o3d
pia

Resources

Encrypt Message



code
soft
python
ios
c
html
jquery
cloud
mobile