Search code examples
c++integerinteger-overflow

Program accuracy varying by parameters


I am trying to learn how to program in C++, so I created something that allowed to you enter a minimum, and maximum parameter, and it will compute k+(k+1)+(k+2)+...+(max), and compared it to the analytical value, using the standard formula (n(n+1)/2). It seems to work fine when I try small numbers, but when, for example, trying min=4, max=4*10^5 (400,000), I get a negative result for the sum, but a positive result checking with the analytical method, even after changing the type from 'int' to 'long'. Trying other combinations, I have achieved the opposite, with the analytical method resulting in a negative sum. I suspect this is related to the fact the type int can go up to a certain number of digits, but I wanted some confirmation on that, and if it isn't, what the actual problem is. The code is provided below:

#include <iostream>
// Values are inconsistent when paramin,parammax become large. 
// For example, try (parammin,parammax)=(4,400,000)
int main() {
    int parammax,parammin;
    std::cout << "Input a minimum, then maximum parameter to sum up to" << std::endl;
    std::cin >> parammin >> parammax;
    int sum=0;
    for (int iter = parammin; iter <= parammax; iter++){
        sum += iter;
    }
    std::cout << "The sum is: " << sum << std::endl;
    const int analyticalmethod = (parammax*(parammax+1)-parammin*(parammin-1))/2;
    std::cout << "The analytical result for the sum is,"
                 " via (max*(max+1)-min*(min-1))/2: " 
              << analyticalmethod << std::endl;
    return 0;
}

Solution

  • Using very large numbers without control is dangerous in C++. The basic types int, long and long long are implementation dependant, with only the following requirements:

    • int is at least 16 bits large
    • long is at least as large as int and at least 32 bits large
    • long long is at least as large as long and at least 64 bits large

    If you think you can need larger values, you should considere a multi precision library like the excellent gmp.