【问题标题】:How to calculate average of int64_t [duplicate]如何计算 int64_t 的平均值 [重复]
【发布时间】:2019-11-01 22:11:39
【问题描述】:

我需要计算 n 个数字的平均值。 N 在编译时是未知的。每个数字都可以是 int64_t 类型,但我知道平均值也适合 int64_t 类型。问题是 n 个数字的总和对于 int64_t 来说可能太大了。 有什么建议吗?

【问题讨论】:

  • 使用 int128_t?
  • @TarickWelling:标准中没有这样的类型,即使是这样,它也不会真正回答问题(我承认,这可能应该用@987654322 来表达@)。现在,如果您将该链接转换为答案,会很有帮助...
  • 您没有指定您的平台或编译器:GCC 和 CLANG 确实支持 128 位 int 的非标准变体。但我认为我更喜欢增量方法
  • gcc 也有 __builtin_add_overflow 会告诉你是否发生溢出,这也可能有帮助

标签: c++ math average mean


【解决方案1】:

两个没有溢出的平均值

  Average = (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2)

这也可以扩展到 n 个数字。

假设你有来自 N1, N2....Nn-1, Nn 的 n 个数字

Average = (N1 / n) + (N2 / n) +.....+ (Nn-1 / n) + (Nn / n)

                            +

          ((N1 % n) + (N2 % n) +.....+ (Nn-1 % n) + (Nn % n)) / n

【讨论】:

  • 干得好,我正要根据相同的想法提出一种更复杂的方法
  • 有趣的解决方案。但是,它确实要求您在输入 first 号码之前知道n,但如果您这样做了,那么这很好用。
  • 有没有办法将此答案引用到其他人在 cmets 中向 OP 提出的问题?我觉得这是一个比那里提供的更好的答案
  • 小心,如果n 很大,可能存在((N1 % n) + (N2 % n) +.....+ (Nn-1 % n) + (Nn % n)) 溢出的极端情况。
  • @NO_NAME N 为此必须 > 2^32,我认为这适用于大多数情况,如果有人需要,我相信我可以提出一种可以支持理论上无限 N 的算法(事先不知道)
猜你喜欢
  • 2016-01-10
  • 2014-04-20
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多