【发布时间】:2014-07-09 15:02:53
【问题描述】:
我正在使用 Visual Studio 2010 编写 C++/MFC 应用程序,我需要维护一个累积的 running total,用于计算平均传输率,如下所示:
//Let's assume that INT128 is a 128-bit integer type
static INT128 iRunningTotal = 0;
static INT128 iCounter = 0;
LONGLONG iteration_get_current_average(LONGLONG iRate)
{
//May be called repeatedly...
iRunningTotal += iRate;
iCounter++;
//Calculate the current average
return iRunningTotal / iCounter;
}
我搜索了C++ 128-bit integer,几乎所有人们建议使用 Boost 库。嗯,这是一种可能性,但我不熟悉它,并且不会在我的项目中的任何其他地方使用它。
除了 Boost,我很好奇,有没有办法用纯 C/C++ 做到这一点?
【问题讨论】:
-
“我很好奇,有没有办法用纯 C/C++ 做到这一点?” - 答案显然是肯定的,因为 C++ 是图灵完备的。但是,如果您不想使用库,则需要自己制作一个。
-
对于这种特殊情况,您实际上需要一个 128 位整数的可能性很小。传输速率很少(如果有的话)足以超过 64 位整数的容量,
LONGLONG就是这样。一个 64 位整数可以保存最多 16 个 exabytes 的值。 -
并且通过“极不可能” .. 还有 1) iRate 可以缩减(例如 K/s、M/s)和 2) 双倍有 很多 更宽ranger 比 128 位整数,尽管“大值”的准确性损失。 (而且绝对没有理由让 iCounter 变得那么大。)
-
传输速率通常以浮点数表示给用户,很少以每次原始字节数表示,因此将速率计算为每次 kb/mb/gb 将大大减少所需整数的大小(越高单位,所需的位数越小)。
-
使用 64 位无符号整数,您最多可以数 18 exabit。根据cisco,这是到 2017 年世界许多地区预计的每月互联网流量,因此它可能类似于目前的全球每月流量。你真的认为你需要的不止这些吗?
标签: c++ visual-c++ mfc