一个求非常高的数的平均值的程序

c++: a program to find the average of very high numbers?

本文关键字:平均值 程序 非常 一个      更新时间:2023-10-16

所以我试着做一个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";
}

但不知何故,我没有得到我期望的结果。我的老师说这是一个"把戏",甚至没有必要使用double。但我找了又找,并没有找到诀窍。有什么帮助吗?

使用浮点数时必须考虑它们的精度,它由以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>)给你必要的构建块,但是你会在溢出的边缘摇摇欲坠:2倍1019太多了。

你现在必须找到一种方法来计算平均值,而不是将两个数字相加。

<引用类>

假设两个整数M, N使得M <= N, (M + N)/2 = M + (N - M)/2