c00*_*0fd 4 c++ mfc visual-c++
我正在使用 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;
}
Run Code Online (Sandbox Code Playgroud)
我搜索了C++ 128-bit integer几乎所有人们建议使用 Boost 库的地方。嗯,这是一种可能性,但我不熟悉它,也不会在我的项目中的其他任何地方使用它。
所以除了 Boost,我很好奇,有没有办法用纯 C/C++ 做到这一点?
让我们尝试计算一下您的数字可能变得足够大以溢出 64 位数字的点。
假设您每微秒进行一次测量。以每秒 100 万次增量的速度,64 位数字需要2 64 /1'000'000 秒才会溢出。算起来已经超过50万年了。即使将速率提高到每纳秒一次,仍然需要 500 多年的时间。
对于运行总计,您可以(理论上)早一点用完。例如,如果您拥有 100 Gigabit 以太网,并且始终以最大理论带宽运行,那么您将在(略)不到 47 年的时间内耗尽带宽。
如果您将自己限制在我们大多数人实际上都能负担得起的技术上,那么大多数使用处理的最快传输速率是与 SSD 之间的传输速率。假设您有可以处理的驱动器,最新的 SATA Express 规范支持高达 16 Gb/s 的传输速度。在用完 64 位整数的全部范围之前,您需要使该 24/7 饱和 200 多年。
嗯...也许我们应该看看主内存。让我们假设 4 个通道的最快 DDR 4 内存已指定,并且(一如既往)非常不切实际的假设,即您将使其保持在 24/7 的最大理论带宽下运行。有了这个,您仍然可以一次计算 4 年多时间里所有进出内存的所有传输,然后才会遇到 64 位整数溢出的危险。
当然,您可以尝试对 CPU 和 RAM 进行超频,以更快地达到目标,但这可能会是一场失败的游戏——超过最适度的超频可能会降低部件的预期寿命,因此机器可能会在 64 位整数溢出之前死掉。
底线:您对 128 位整数的需求充其量似乎是有问题的。
我将抛开这是否是一个好主意的问题,或者您正在测量的物理量是否在理论上甚至可能超过 2^63 或 10^19 或大约的值。我相信你有你的理由。那么你在纯 C/C++ 中有哪些选择?
答案是:不多。
那么,你自己的 128 位整数算法怎么样?你真的必须是一个受虐狂。做加法和减法很容易(注意你的进位),稍微思考一下,做乘法也不太难。分裂完全是另一回事。这是非常困难的,并且可能的结果是类似于 1990 年代奔腾错误的错误。
您可能可以毫不费力地将计数器累积为两个(或更多)64 位整数。然后将它们转换为双精度数以供最后计算。那应该不会太难。
之后恐怕要去图书馆买东西了。您提到了 Boost,但周围有更多专门的库,例如 cpp-bigint。
毫不奇怪,这个问题之前有人问过并且有一个很好的答案:Representing 128-bit numbers in C++。