所以我试图做一个c ++程序,可以找到非常高的数字的平均值(范围是
这是我的尝试:
#include <iostream>
int main()
{
long double a,b,result;
std::cin>>a;
std::cin>>b;
result=(a+b)/2;
std::cout<<result<<"\n";
}
但是不知何故,我没有达到预期的结果。我的老师说有一个“把戏”,甚至不需要使用双重技巧。但我进行了搜索和研究,但没有找到窍门。有什么帮助吗?
最佳答案
使用浮点数时,必须考虑其精度,它以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位浮点数一致。
由于1019在18位数字以上(它有20位),因此您选择的类型缺乏表示其下所有数字的必要精度,并且没有任何计算量可以恢复丢失的数据。
让我们切换回积分,虽然它们的范围更受限制,但对于相同数量的位,它们具有更高的精度。 64位有符号整数最大为9,223,372,036,854,775,807,无符号版本最多为18,446,744,073,709,551,615。为了比较1019是10,000,000,000,000,000,000。
uint64_t
(来自<cstdint>
)为您提供了必要的构建基块,但是您将在溢出的边缘徘徊:1019的2倍太多了。现在,您必须找到一种无需将两个数相加即可计算平均值的方法。
假设两个整数M,N使得M