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

时间:2014-05-21 06:09:54

标签: c++ visual-c++ mfc

我正在使用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 ++做到这一点?

2 个答案:

答案 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位整数不属于任何标准,也不支持我所知的编译器。
  • 64位double将为您提供动态范围(10 ^ 308左右)。如果您不需要确切的答案,这是一个很好的选择。不幸的是,如果你有一个有足够零的数字并且你加了一个,它就不会改变。
  • 浮点处理器本身支持80位双倍,它为您提供63位尾数和扩展动态范围。

那么,滚动自己的128位整数运算怎么样?你真的必须是一个受虐狂。这很容易做加法和减法(记住你的携带),并且有点想到它不是很难做乘法。分裂完全是另一回事。这是非常困难的,可能的结果是类似于20世纪90年代的奔腾虫的错误。

你可能会在两个(或更多)64位整数中累积你的计数器而没有太大困难。然后将它们转换为双打,以便在最后进行计算。这不应该太难。

之后,我担心它会去图书馆购物。提到你提到过,但是还有更多专门的库,比如cpp-bigint。

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