Create a function that calculates the result of the geometric series
$\sum_{k = 0}^n ar^k$
where $a$ and $r$ are real numbers and $n$ is an integer. You can find such a formula at Wikipedia.
If $|r| < 1$, the infinite geometric series is:
$\sum_{k = 0}^\infty ar^k$
Your function declarations will be:
double geometric_series( double initial_value, double ratio, unsigned int n ); double geometric_series( double initial_value, double ratio );
where the second returns the infinite geometric series.
The following functions explicitly calculates the series, as opposed to using a formula. When this formula gives a different answer from yours, which do you suspect is more correct?
double geometric_series_explicit( double initial_value, double ratio, unsigned int n ); double geometric_series_explicit( double initial_value, double ratio ); double geometric_series_explicit( double initial_value, double ratio, unsigned int n ) { double sum{initial_value}; double power{1.0}; for ( unsigned int k{1}; k <= n; ++k ) { power *= ratio; sum += initial_value*power; } return sum; } double geometric_series_explicit( double initial_value, double ratio ) { double previous_sum; // Uninitialized double sum{initial_value}; double power{1.0}; do { power *= ratio; previous_sum = sum; sum += initial_value*power; } while ( previous_sum != sum ); return sum; }
Once you have written your implementations, you can compare the results by running the following program:
#include <iostream> // Function declarations int main(); double geometric_series( double initial_value, double ratio, unsigned int n ); double geometric_series( double initial_value, double ratio ); double geometric_series_explicit( double initial_value, double ratio, unsigned int n ); double geometric_series_explicit( double initial_value, double ratio ); // Function definitions double geometric_series_explicit( double initial_value, double ratio, unsigned int n ) { double sum{initial_value}; double power{1.0}; for ( unsigned int k{1}; k <= n; ++k ) { power *= ratio; sum += initial_value*power; } return sum; } double geometric_series_explicit( double initial_value, double ratio ) { double previous_sum; // Uninitialized double sum{initial_value}; double power{1.0}; do { power *= ratio; previous_sum = sum; sum += initial_value*power; } while ( previous_sum != sum ); return sum; } int main() { std::cout.precision( 16 ); double a, r; unsigned int n; while ( true ) { std::cout << "Enter the initial value 'a': "; std::cin >> a; std::cout << "Enter the ratio 'r': "; std::cin >> r; std::cout << "Enter the upper limit 'n': "; std::cin >> n; std::cout << geometric_series( a, r, n ) << std::endl; std::cout << geometric_series_explicit( a, r, n ) << std::endl; std::cout << geometric_series( a, r ) << std::endl; std::cout << geometric_series_explicit( a, r ) << std::endl; } return 0; }