程序精度因参数而异

Program accuracy varying by parameters

我正在尝试学习如何用 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;
}

在 C++ 中不加控制地使用非常大的数字是危险的。基本类型 intlonglong long 依赖于实现,只有以下要求:

  • int 至少大 16 位
  • long 至少与 int 一样大并且至少大 32 位
  • long long 至少和 long 一样大并且至少有 64 位大

如果您认为您可以需要更大的值,您应该考虑像优秀的 gmp.

这样的多精度库