所以我试图做一个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
07-24 09:45
查看更多