Skip to the content of the web site.

Project S.2: Geometric series

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