所以我试图制作一个可以找到非常高数字的平均值的c ++程序(范围<10 ^ 19)
继续我的尝试:#include <iostream>
int main()
{
long double a,b,result;
std::cin>>a;
std::cin>>b;
result=(a+b)/2;
std::cout<<result<<"\n";
}
但不知怎的,我没有得到我预期的结果。我的老师说有一个“伎俩”,甚至没有必要使用双倍。但我搜索和研究,并没有找到诀窍。那有什么帮助吗?
答案 0 :(得分:2)
使用浮点数时,你必须考虑它们的精度,它在基数10中由std::numeric_limits<T>::digits10
表示,以下程序可以给它们(它们可能取决于你的平台) :
#include <iostream>
#include <limits>
int main() {
std::cout << "float: " << std::numeric_limits<float>::digits10 << "\n";
std::cout << "double: " << std::numeric_limits<double>::digits10 << "\n";
std::cout << "long double: " << std::numeric_limits<long double>::digits10 << "\n";
return 0;
}
在ideone我得到:
float: 6
double: 15
long double: 18
这与32位,64位和80位浮点数(分别)一致。
由于10 19 高于18位数(它有20位),所选择的类型缺乏表示其下方所有数字的必要精度,并且没有任何计算量可以恢复丢失的数据。
让我们切换回积分,虽然它们的范围更有限,但它们对于相同的位数具有更高的精度。 64位有符号整数的最大值为9,223,372,036,854,775,807,无符号版本的最大值为18,446,744,073,709,551,615。为了比较,10 19 是10,000,000,000,000,000,000。
uint64_t
(来自<cstdint>
)为您提供必要的构建块,但是您将在溢出的边缘摇摇欲坠:2次10 19 是太多了。
您现在必须找到一种计算平均值的方法,而不必将两个数字加在一起。
假设两个整数M,N使得M <= N,(M + N)/ 2 = M +(N-M)/ 2