Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以在MSVC+;中使用128位整数吗+;?_C++_Visual C++_Mfc - Fatal编程技术网

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

C++ 我可以在MSVC+;中使用128位整数吗+;?,c++,visual-c++,mfc,C++,Visual C++,Mfc,我正在使用Visual Studio 2010编写一个C++/MFC应用程序,我需要维护一个累积的运行总数,用于计算平均传输速率,如下所示: //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) { //M

我正在使用Visual Studio 2010编写一个C++/MFC应用程序,我需要维护一个累积的
运行总数
,用于计算平均传输速率,如下所示:

//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位整数
,几乎所有人们建议使用Boost库的地方。嗯,这是可能的,但我不熟悉它,也不在我的项目中的任何其他地方使用它


我很好奇,抛开Boost不谈,纯C/C++有没有办法做到这一点呢?

让我们试着计算一下,在这个点上,数字可能变得足够大,以至于溢出64位数字

假设你每微秒测量一次。以每秒100万个增量的速率,64位数字溢出需要264/1'000'000秒。计算结果是五十多万年。即使将速率提高到每纳秒一次,也需要500多年的时间

对于跑步总数,你可以(理论上)跑得更快一点。例如,如果你有100千兆以太网,并且它一直以最大理论带宽运行,那么在不到47年的时间里(稍微)你就用完了

如果你将自己局限于我们大多数人实际上能负担得起的技术,那么大多数人使用的最快传输速率是从SSD到SSD的传输速率。假设您有可以处理它的驱动器,最新的SATA Express规范支持高达16 Gb/s的传输。在使用完64位整数的全部范围之前,需要将其24/7饱和200多年

嗯……也许我们应该看看主存储器。让我们假设4个通道的最快DDR 4内存尚未指定,和(一如既往)极不现实的假设,您将保持它运行在最大理论带宽24/7。这样,在64位整数溢出的危险出现之前,您仍然可以一次统计超过4年的内存之间的所有传输

当然,你可以试着让CPU和RAM的时钟过快一点,但这可能是一个失败的游戏——任何超过最适度的超频都可能会缩短部件的预期寿命,因此机器可能会在64位整数溢出之前死亡


一句话:你对128位整数的需求充其量是值得怀疑的。

我将撇开这个问题不谈,不管它是不是一个好主意,或者你正在测量的物理量在理论上是否会超过2^63或10^19左右。我相信你有你的理由。那么,在纯C/C++中,您有哪些选择

答案是:不多

  • 128位整数不是任何标准的一部分,我知道的编译器也不支持128位整数
  • 64位双精度将为您提供动态范围(10^308左右)。如果你不需要精确的答案,这是一个很好的选择。不幸的是,如果你有一个有足够多零的数字,并且加上一个,它不会改变
  • 浮点处理器本机支持80位双精度运算,这为您提供了63位尾数和扩展的动态范围
那么,您自己的128位整数算法怎么样?你一定是受虐狂。做加法和减法很容易(注意随身携带的物品),稍加思考,做乘法也不难。分裂完全是另一回事。这是非常困难的,可能的结果是出现类似于20世纪90年代奔腾错误的错误

您可以轻松地将计数器累加为两个(或更多)64位整数。然后将它们转换为双精度,以便在最后进行计算。这应该不会太难

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


这个问题以前被问过,而且有一个很好的答案:

“我很好奇,有没有办法用纯C/C++来做这个?”——答案是显然是的,因为C++是图灵完成的。但是,如果你不想使用库,你需要自己制作一个。在这种特殊情况下,你实际上不太可能需要128位整数。传输速率很少(如果有的话)高到足以超过64位整数的容量,而64位整数是
LONGLONG
。一个64位整数最多可以保存16 EB的值。并且“极不可能”。。此外,1)iRate可以缩小(例如K/s、M/s),2)double比128位整数具有更宽的范围,尽管“大值”的精度有所降低。(iCounter绝对没有理由这么大。)传输速率通常表示为用户的浮点数,很少表示为每次原始字节,因此将速率计算为每次kb/mb/gb将大大减少所需整数的大小(单位越高,所需位越小)。对于64位无符号整数,最多可计算18 EB。根据这一数据,到2017年,世界上许多地区的预期每月互联网流量都将增加,因此很可能与目前的全球每月流量差不多。你真的认为你需要更多吗?谢谢。我很感谢你花时间来解决这个问题。嗯。。。实现128位除法和其他基本整数算法并不难。很明显,为了速度,你会在asm中这样做@艾哈迈德0:我非常不同意。正如我所说的,实现分区是困难的,而测试它的正确性则更加困难。英特尔失败了,很多年前我们也失败了(谁知道克努斯有车?)。你的代码可能是正确的,也可能是错误的,谁能说出来呢?广泛使用和测试的库是一条路。@david.pfx花时间测试的人可以告诉我们。您认为广泛使用和测试的库的测试方式与您所做的不同。。。?所有这些“事故”都是由于缺乏实际护理而导致的微不足道的无能