程序精度因参数而异

时间:2019-01-25 10:02:07

标签: c++ integer integer-overflow

我试图学习如何用C ++编程,因此我创建了一些东西,允许您输入最小和最大参数,它将计算k+(k+1)+(k+2)+...+(max),并使用标准公式(n(n+1)/2)。当我尝试较小的数字时,它似乎工作正常,但是,例如,当尝试min=4max=4*10^5(400,000)时,我得到的总和为负数,但通过分析得出的结果为正数方法,即使将类型从“ int”更改为“ long”也是如此。尝试其他组合时,我得到了相反的结果,分析方法得出的结果为负数。我怀疑这与类型int可以上升到一定数字这一事实有关,但是我想对此进行一些确认,如果不是,则实际问题是什么。下面提供了代码:

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

1 个答案:

答案 0 :(得分:1)

在C ++中使用非常大的数字而不加控制是危险的。基本类型intlonglong long与实现有关,仅具有以下要求:

  • int的大小至少为16位
  • long至少与int一样大且至少32位大
  • long long至少与long一样大且至少64位大

如果您认为需要更大的值,则应考虑使用多精度库,例如出色的gmp