我想知道在C ++中使用什么样的方法来乘以数字。这是传统的教科书长期乘法吗? Fürer's algorithm? Toom-Cook?
我很想知道因为我需要增加极大的数字并且需要高效率。因此,传统的教科书长乘法O(n^2)
可能效率太低,我需要采用另一种乘法方法。
那么C ++使用什么样的乘法?
答案 0 :(得分:23)
你似乎在这里遗漏了几件重要的事情:
要获得bignum(任意精度)算术,您需要自己实现它或使用库。 (例如GMP)与Java和C#(以及其他)不同,C ++没有用于任意精度算术的库。
所有这些奇特的算法:
O(n^1.585)
< O(n^1.465)
~ O(n log(n))
仅适用于在bignum库中实现的bignum算法。处理器用于其本机算术运算的内容有点无关紧要 通常是恒定的时间。
无论如何,我不建议您尝试实现bignum库。我以前做过,而且要求很高(尤其是数学)。所以你最好使用图书馆。
答案 1 :(得分:3)
“超大数字”是什么意思?
与大多数其他编程语言一样,C ++使用处理器内置的乘法硬件。究竟如何工作不是由C ++语言指定的。但是对于普通整数和浮点数,你将无法在软件中更快地编写内容。各种数据类型可以表示的最大数字可以在不同的实现之间变化,但是 int 的一些典型值是2147483647, long 的一些典型值是9223372036854775807,以及1.79769 e + 308 double 。
答案 2 :(得分:1)
在C ++中,整数乘法由芯片处理。在标准语言中没有Perl的BigNum,尽管我确信这些库确实存在。
答案 3 :(得分:0)
这一切都取决于所使用的库和编译器。
答案 4 :(得分:0)
它在硬件中执行。出于同样的原因,巨大的数字将无法运作。在64位硬件中可以表示的最大数字c ++是18446744073709551616.如果需要更大的数字,则需要任意精度库。
答案 5 :(得分:0)
plain c ++使用CPU多指令(或者如果你的CPU没有这样的指令,则使用位移和添加的教科书乘法。)
如果您需要对大数字进行快速乘法,我建议您查看gmp(http://gmplib.org)并使用gmpxx.h中的c ++接口
答案 6 :(得分:0)
如果使用大数字,c ++中的标准整数乘法将不再有效,您应该使用提供任意精度乘法的库,如GMP http://gmplib.org/
此外,在编写应用程序之前,您不必担心性能(=过早优化)。这些乘法将很快,并且很可能软件中的许多其他组件会导致更慢的速度。
答案 7 :(得分:0)
这些数字究竟有多大?甚至像python这样的语言也可以在标准处理器上以每秒超过300万次的任意精度整数进行1e100*1e100
。这是100个重要位置的倍增,不到百万分之一秒。把它放到上下文中,可观察宇宙中只有大约10 ^ 80个原子。
首先编写您想要实现的内容,并在必要时进行优化。