【问题标题】:c++: a program to find the average of very high numbers?C++:一个程序来找到非常高的数字的平均值?
【发布时间】:2015-10-18 16:27:50
【问题描述】:

所以我试图制作一个可以找到非常高数字的平均值的 c++ 程序(范围是

这是我的尝试:

#include <iostream>
int main()
{

    long double a,b,result;
    std::cin>>a;
    std::cin>>b;
    result=(a+b)/2;
    std::cout<<result<<"\n";
}

但不知何故,我没有达到我预期的结果。我的老师说有一个“技巧”,甚至不需要使用双重。但我搜索和研究并没有找到诀窍。有什么帮助吗?

【问题讨论】:

  • 首先,结果是什么,预期的结果是什么?那么,为什么这两者不同,为了达到正确的结果需要做些什么不同的事情呢?另外,导致问题的输入是什么?也可以考虑使用字符串流来模拟输入!
  • 64 位 int... 几乎可以工作... doubles 只会给出一个近似值...
  • @UlrichEckhardt 我得到的结果是指数数字。如果我输入 10^19 和 10^19(当然是正常数字),我会得到 1e+019 但我希望我的结果不是指数数字(10000000000000000000)。
  • 如果你的老师说有一个“技巧”,我想它一定与这两个数字有关。它会帮助你描述你目前在课堂上学习的主题,并给出你任务的完整措辞。
  • 您可以考虑使用bignum 库,例如GMPlib

标签: c++ average


【解决方案1】:

当使用浮点数时,您必须考虑它们的精度,它由以 10 为底的std::numeric_limits&lt;T&gt;::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(来自 &lt;cstdint&gt;)为您提供了必要的构建块,但是您将在溢出边缘摇摇欲坠:2 乘以 1019 太多了。

您现在必须找到一种无需将两个数字相加即可计算平均值的方法。

假设两个整数 M, N 使得 M

【讨论】:

  • uint64_t 仅适用于 C++11,此时您不妨使用unsigned long long。它理论上可能超过 64 位,不需要标头,并且保证存在(尽管uint64_t 不存在的可能性似乎很低)。
  • @chris:在 2015 年,我认为没有理由不假设 C++11 的可用性,除非明确指定(比如......我还没有在工作中使用它:()。在任何情况下,我更喜欢推荐具有 explicit 位宽的类型,而不是在 C 整数类型的瘴气中蜿蜒曲折,其中涵盖的值范围取决于平台的突发奇想。
  • 对,我不太关注需要 C++11 的部分,而是更关注“既然你有了 C++11,就有了替代品”部分。感谢您分享您对使用哪种替代方案的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多