程序精度因参数而异
Program accuracy varying by parameters
我正在尝试学习如何用 C++ 编程,所以我创建了一些允许您输入最小和最大参数的东西,它会计算 k+(k+1)+(k+2)+...+(max)
,并将其与分析值进行比较,使用标准公式 (n(n+1)/2)
。当我尝试小数字时它似乎工作正常,但是当例如尝试 min=4
、max=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++ 中不加控制地使用非常大的数字是危险的。基本类型 int
、long
和 long long
依赖于实现,只有以下要求:
int
至少大 16 位
long
至少与 int
一样大并且至少大 32 位
long long
至少和 long
一样大并且至少有 64 位大
如果您认为您可以需要更大的值,您应该考虑像优秀的 gmp.
这样的多精度库
我正在尝试学习如何用 C++ 编程,所以我创建了一些允许您输入最小和最大参数的东西,它会计算 k+(k+1)+(k+2)+...+(max)
,并将其与分析值进行比较,使用标准公式 (n(n+1)/2)
。当我尝试小数字时它似乎工作正常,但是当例如尝试 min=4
、max=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++ 中不加控制地使用非常大的数字是危险的。基本类型 int
、long
和 long long
依赖于实现,只有以下要求:
int
至少大 16 位long
至少与int
一样大并且至少大 32 位long long
至少和long
一样大并且至少有 64 位大
如果您认为您可以需要更大的值,您应该考虑像优秀的 gmp.
这样的多精度库