我可以在 MSVC++ 中使用 128 位整数吗?

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++ 做到这一点?

Jer*_*fin 5

让我们尝试计算一下您的数字可能变得足够大以溢出 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 位整数的需求充其量似乎是有问题的。


dav*_*pfx 5

我将抛开这是否是一个好主意的问题,或者您正在测量的物理量是否在理论上甚至可能超过 2^63 或 10^19 或大约的值。我相信你有你的理由。那么你在纯 C/C++ 中有哪些选择?

答案是:不多。

  • 128 位整数不是任何标准的一部分,我知道的编译器也不支持它们。
  • 64 位双精度将为您提供动态范围(10^308 左右)。如果您不需要确切的答案,这是一个很好的选择。不幸的是,如果您有一个包含足够多的零的数字,并且您在其中添加一个,它就不会改变。
  • 浮点处理器本身支持 80 位双精度,这为您提供 63 位尾数和扩展的动态范围。

那么,你自己的 128 位整数算法怎么样?你真的必须是一个受虐狂。做加法和减法很容易(注意你的进位),稍微思考一下,做乘法也不太难。分裂完全是另一回事。这是非常困难的,并且可能的结果是类似于 1990 年代奔腾错误的错误。

您可能可以毫不费力地将计数器累积为两个(或更多)64 位整数。然后将它们转换为双精度数以供最后计算。那应该不会太难。

之后恐怕要去图书馆买东西了。您提到了 Boost,但周围有更多专门的库,例如 cpp-bigint。

毫不奇怪,这个问题之前有人问过并且有一个很好的答案:Representing 128-bit numbers in C++