c ++:一个程序来查找非常高的数字的平均值?

时间:2015-10-18 16:27:50

标签: c++ average

所以我试图制作一个可以找到非常高数字的平均值的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";
}

但不知怎的,我没有得到我预期的结果。我的老师说有一个“伎俩”,甚至没有必要使用双倍。但我搜索和研究,并没有找到诀窍。那有什么帮助吗?

1 个答案:

答案 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