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;
}