【问题标题】:16,32 etc.-byte variable for a utopic applicationutopic 应用程序的 16,32 等字节变量
【发布时间】:2013-05-10 22:11:11
【问题描述】:

以下几行是我真正“无用”的 C++ 程序的一部分...由于“无符号”的长度,该程序仅计算 2 的幂到 2^63 而不是“正在询问”的 2^128 long long" 变量,建议用于精度为 15 位的数字...!!!

就是这样....我需要一个 16 字节或更多的变量...不是由以下提供的:

-__int128(Visual Studio 2010 将字母变为蓝色,但出现红线和调试错误:“keyword not supported on this architecture”32 位系统)

-Boost::Projects...当我遇到专业网站(boost::bigint...存在吗? ??不是反问句)

(-当然要多打字)

int main()
{   
    unsigned long long result;
    int i;
    const int max=128;

    for(i=0, result=1ll; i <= max; ++i,result *=2 )
        cout<<setw(3)<< i <<setw(32)<< result <<endl;

    system("pause");
    return 0;
}

【问题讨论】:

  • 在旁注中,循环中的边界检查是错误的,128 位无符号可以从 2⁰ 变为 2exponent(128)-1。你的循环被执行了 129 次(0 到 128),它应该是 128。
  • @Étienne 第一个通知是正确的(我已经使用 8 和 4 字节变量面对 64,32 等较小的循环......另一方面,从我的观点来看,第二个不是真的观点。如果for(expressions;test;increasement)statements; 并且具有test=&gt;statements=&gt;increasement=&gt;test=&gt;statements etc当它“运行”时的顺序,因为 x^0=1 如果你运行这个程序会给你输出: 2^0=1 , 2^1=2 , 2^2=4 2^3=8 等等
  • 使用 128 位变量,它将显示 2^0=1 2^1=2 2^3=8...2^128=0 因为 2^128 会溢出。使用 unsigned long long 它已经显示 2^64=0。

标签: c++ variables 128-bit


【解决方案1】:

您可以在 C++ 中找到一个“bigint”实现,它实现 operator&lt;&lt;() 以输出到 ostream,但如果您只想将 2 的幂次打印到控制台或文本字符串,那么您不需要实际上做“bigint”数学(除了计算那些 2 的幂),有一种更简单的方法可以让你 2 的幂几乎与你想去的一样大,并且有耐心去看看:

将每个十进制数字(数字 0 到 9)存储为一个单独的实体,可能是一个字符数组或整数数组,或者存储在一个 std::list 中。使用 std::list 的优点是,随着数字变大,您可以轻松地在前面添加新的数字位置,但是您可以通过将数字以相反的顺序存储在 std::vector 中来轻松做到这一点(当然要打印它们,您必须从后到前迭代以按正确顺序打印数字)。

一旦你弄清楚你想如何存储数字,你的数字加倍算法如下:迭代大数字的数字,将每个数字加倍(当然是 mod 10)并携带任何溢出(即 bool这表示如果它的结果​​...在 %10... 之前大于 9) 从那个数字到下一个数字。在下一个数字上,先将其加倍,然后如果前一个数字溢出,则加 1。如果该结果溢出,则将该溢出继续到下一个数字并继续到所有数字的末尾。在数字的末尾,如果将最后一个数字加倍并添加前一个数字的任何溢出导致最后一个数字溢出,则添加一个新数字并将其设置为 1。然后打印生成的数字列表。

使用此算法,您可以打印任意大的 2 次幂。当然,它们不是“数字”,因为您不能直接在 C++ 数学运算中使用它们。

【讨论】:

    【解决方案2】:

    在现代 CPU 的情况下,SSE 和 AVX 内部函数最多可达 256 字节。它们被命名为__m128i__m256i

    【讨论】:

    • 但是一旦他把它放在公羊里。怎么打印?
    • 加上 __m128 是 4 个 32 位浮点数。我相信他想要整数精度。浮点数最终会变成 1.329803e+36
    • 嗯,对,应该是 __m256i(注意 i 后缀)。打印当然是你的问题。 std::cout&lt;&lt; 不了解 SSE 内在函数。
    • 我发现#include 是必需的,但你可以计算和打印谁......如果有人能给我一个使用 _m128int 的 adove 程序示例,我会很高兴/跨度>
    【解决方案3】:

    128 位整数是一个非常大的整数。您应该实现自己的数据类型。您可以创建一个 shorts 数组,在其中存储数字(数字)并实现乘法,就像您在数学笔记本中所做的那样,这可能是最简单的方法。

    这个当然还没完! '2' 仍然不见了 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2019-06-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2018-07-06
      相关资源
      最近更新 更多