【问题标题】:How do integers multiply in C++?整数如何在 C++ 中相乘?
【发布时间】:2012-03-10 19:04:03
【问题描述】:

我想知道在 C++ 中使用哪种方法来乘数。是传统教科书的长乘法吗? Fürer's algorithm? Toom-Cook?

我想知道,因为我需要乘以非常大的数字并且需要高度的效率。因此,传统的教科书长乘法O(n^2) 可能效率太低,我需要求助于另一种乘法方法。

那么 C++ 使用什么样的乘法呢?

【问题讨论】:

  • 芯片做什么,它做什么。
  • 标题让我想到了整数复制:)
  • @harold 首先,他们必须做一些叫做“约会”的事情。

标签: c++ c algorithm math


【解决方案1】:

您似乎在这里遗漏了几件重要的事情:

  1. native 算术和 bignum 算术之间存在区别。
  2. 您似乎对 bignum 算术感兴趣。
  3. C++ 不支持 bignum 算术。原始数据类型通常是处理器的本机算术。

要获得 bignum(任意精度)算术,您需要自己实现或使用库。 (例如GMP)与Java 和C#(以及其他)不同,C++ 没有用于任意精度算术的库。

所有这些花哨的算法:

  • 唐叶:O(n^1.585)
  • 汤姆库克:< O(n^1.465)
  • 基于 FFT:~ O(n log(n))

仅适用于在 bignum 库中实现的 bignum 算术。处理器用于其本机算术运算的内容有些无关紧要,因为它是 通常是恒定的时间。


无论如何,我不建议您尝试实现 bignum 库。我以前做过,而且要求很高(尤其是数学)。所以你最好使用图书馆。

【讨论】:

  • 直到你得到非常大的数字,你在小学学到的方法在实践中会表现得更好。当然,您使用大于 10 的基数。:-) 根据您的需要,2^32、2^64 或 10^9 是方便的基数(10 的幂在解析/打印以 10 为基数的数字时很有用优化很重要,10^9 是适合 32 位的最大功率)。
【解决方案2】:

“非常大的数字”是什么意思?

与大多数其他编程语言一样,C++ 使用处理器中内置的乘法硬件。 C++ 语言没有具体说明它是如何工作的。但是对于普通整数和浮点数,您将无法在软件中更快地编写一些东西。

各种数据类型可以表示的最大数字在不同的实现之间可能有所不同,但一些典型值是 int 的 2147483647、long 的 9223372036854775807 和 1.79769 double 为 e+308。

【讨论】:

    【解决方案3】:

    在 C++ 中,整数乘法由芯片处理。标准语言中没有 Perl 的 BigNum 等价物,尽管我确信这样的库确实存在。

    【讨论】:

    • 吹毛求疵:不一定。实现完全有可能包含目标体系结构不支持的数字类型(即使是int,尽管 that 应该相当罕见),而是在它们上实现算术运算作为对某些运行时库的调用.考虑 128 位整数,或者可能是 32 位系统上的 64 位整数。此外,过去有很多芯片没有浮点单元(FPU)。
    • @delnan:罕见,但并非不存在:8 位 6502 处理器没有 16 位算术指令,因此 CC65 C 编译器必须通过 8 位指令序列来实现 int 算术和库调用。
    【解决方案4】:

    这一切都取决于使用的库和编译器。

    【讨论】:

      【解决方案5】:

      它是在硬件中执行的。出于同样的原因,巨大的数字将不起作用。 c++ 在 64 位硬件中可以表示的最大数字是 18446744073709551616。如果您需要更大的数字,您需要一个任意精度的库。

      【讨论】:

      • 双打怎么样?此外,大多数数据类型的确切大小取决于编译器。我也相信一些编译器提供 128 位整数类型。
      【解决方案6】:

      如果您处理大数,c++ 中的标准整数乘法将不再适用,您应该使用提供任意精度乘法的库,例如 GMP http://gmplib.org/

      此外,在编写应用程序之前,您不应该担心性能(=过早的优化)。这些乘法速度会很快,而且您软件中的许多其他组件很可能会导致更慢的速度。

      【讨论】:

        【解决方案7】:

        普通 c++ 使用 CPU 多指令(如果您的 CPU 没有这样的指令,则使用移位和加法的教科书乘法。)

        如果您需要对大数进行快速乘法,我建议您查看 gmp (http://gmplib.org) 并使用 gmpxx.h 中的 c++ 接口

        【讨论】:

          【解决方案8】:

          这些数字会有多大?甚至像 python 这样的语言也可以在标准处理器上以每秒超过 300 万次的任意精度整数执行1e100*1e100。这是乘以不到百万分之一秒的 100 个重要位置。综上所述,可观测宇宙中只有大约 10^80 个原子。

          先写下你想要实现的,如果有必要,稍后再优化。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-03
            • 2021-11-20
            • 2011-11-13
            • 1970-01-01
            • 2013-12-09
            • 1970-01-01
            • 2021-02-22
            • 2017-02-09
            相关资源
            最近更新 更多