我正在使用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库。嗯,这是一种可能性,但我不熟悉它,也不会在我项目的其他任何地方使用它。
除此之外,我很好奇,有没有办法用纯C / C ++做到这一点?
答案 0 :(得分:2)
让我们尝试计算您的数字可能变得足够大以溢出64位数字的点。
让我们假设您每微秒进行一次测量。以每秒100万个增量的速率,对于64位数字溢出,它将需要2 64 / 1' 000� 000秒。这可以解决超过50万年的计算。即使你将速率提高到每纳秒一次,它仍然需要超过500年。
对于跑步总数,你可以(理论上)早点跑出来。例如,如果您拥有100千兆位以太网,并且始终以最大理论带宽运行,那么您将在不到47年的时间内(略微)耗尽。
如果您将自己局限于我们大多数人实际可以承受的技术,那么大多数使用的最快传输速率都是针对SSD的。假设您有可以处理它的驱动器,最新的SATA Express规范支持高达16 Gb / s的传输。在耗尽64位整数的全部范围之前,您需要在24小时内将其饱和超过200年。
嗯......也许我们应该看看主记忆。让我们假设4个通道中指定了最快的DDR 4内存,并且(一如既往)假设您保持最大理论带宽24/7的运行。有了这个,你仍然可以计算所有进出存储器的所有传输超过4年,然后你就会遇到64位整数溢出的危险。当然,您可以尝试超频CPU和RAM以实现更快的速度,但这可能是一场失败的游戏 - 除了非常最适度的超频之外可能会降低部件的预期寿命,因此机器可能会在64位整数溢出之前死掉。
结论:您对128位整数的需求似乎充其量是值得怀疑的。
答案 1 :(得分:2)
我将抛开一个好主意的问题,或者你所测量的物理量是否在理论上甚至超过2 ^ 63,或10 ^ 19或其附近的值。我确定你有理由。那么你在纯C / C ++中的选择是什么?
答案是:并不多。
那么,滚动自己的128位整数运算怎么样?你真的必须是一个受虐狂。这很容易做加法和减法(记住你的携带),并且有点想到它不是很难做乘法。分裂完全是另一回事。这是非常困难的,可能的结果是类似于20世纪90年代的奔腾虫的错误。
你可能会在两个(或更多)64位整数中累积你的计数器而没有太大困难。然后将它们转换为双打,以便在最后进行计算。这不应该太难。
之后,我担心它会去图书馆购物。提到你提到过,但是还有更多专门的库,比如cpp-bigint。
毫不奇怪,这个问题之前已经被问过并且有一个非常好的答案:Representing 128-bit numbers in C++。