整数在C++;? 我想知道C++中用什么方法来乘数。是传统教科书上的长乘法吗
我想知道,因为我需要将非常大的数字相乘,并且需要很高的效率。因此,传统的教科书长乘法整数在C++;? 我想知道C++中用什么方法来乘数。是传统教科书上的长乘法吗,c++,c,algorithm,math,C++,C,Algorithm,Math,我想知道,因为我需要将非常大的数字相乘,并且需要很高的效率。因此,传统的教科书长乘法O(n^2)可能效率太低,我需要求助于另一种乘法方法 < C++使用的乘法是什么?这都取决于所用的库和编译器。C++整数乘法中的< p>由芯片处理。在标准语言中没有与Perl的BigNum等价的库,尽管我确信确实存在这样的库。你所说的“极大的数字”是什么意思 与大多数其他编程语言一样,C++使用处理器内置的乘法硬件。具体的工作原理没有被C++语言指定。但对于普通整数和浮点数,您将无法在软件中编写更快的内容 各种数
O(n^2)
可能效率太低,我需要求助于另一种乘法方法
< C++使用的乘法是什么?这都取决于所用的库和编译器。C++整数乘法中的< p>由芯片处理。在标准语言中没有与Perl的BigNum等价的库,尽管我确信确实存在这样的库。你所说的“极大的数字”是什么意思 与大多数其他编程语言一样,C++使用处理器内置的乘法硬件。具体的工作原理没有被C++语言指定。但对于普通整数和浮点数,您将无法在软件中编写更快的内容
各种数据类型可以表示的最大数字在不同的实现中可能有所不同,但一些典型值是int的2147483647,long的9223372036854775807,以及double的1.79769e+308。您似乎忽略了几个关键点:
- 喀拉祖巴:
O(n^1.585)
- 图姆·库克:
- 基于FFT的:
~O(n log(n))
无论如何,我不建议您尝试实现bignum库。我以前做过,要求很高(尤其是数学)。因此,您最好使用库。它是在硬件中执行的。出于同样的原因,庞大的数字是行不通的。在64位硬件中,C++最大的数字是1844 6740407370955 1616。如果你需要更大的数字,你需要一个任意的精确库。< /P> < P>普通C++使用CPU多指令(或者如果你的CPU没有这样的指令,使用移位和加法的教科书乘法)。
如果需要大量的快速乘法,我建议看GMP(),使用GMPX.H./P>< C++接口。如果你用大数,C++中的标准整数乘法将不再工作,你应该使用一个提供任意精度乘法的库,如GMP < /P>
此外,在编写应用程序之前,您不应该担心性能(=过早优化)。这些乘法运算会很快,而且很可能软件中的许多其他组件会导致更大的减速。这些数字会有多大?甚至像python这样的语言也可以在标准处理器上以每秒超过300万次的任意精度整数执行
1e100*1e100
。这是用不到百万分之一秒的时间乘以100个重要位置。把它放在上下文中,在可观测的宇宙中只有大约10^80个原子
首先写下你想要实现的目标,然后在必要时进行优化。无论芯片做什么,它都会做。这个标题让我想到整数复制:)@harold first他们必须做一件叫做“约会”的事情。挑剔一点:不一定。实现完全有可能包括目标体系结构不支持的数字类型(即使是
int
,但这应该是相当罕见的),而是在它们上实现算术运算,作为对某些运行库的调用。在32位系统上考虑128位整数,或者可能是64位整数。此外,过去有很多没有浮点单元(FPU)的芯片。@delnan:很少见,但并非不存在:8位6502处理器没有16位算术指令,因此CC65 C编译器必须通过8位指令序列和库调用来实现int
算术。那么双倍呢?此外,大多数数据类型的确切大小取决于编译器。我还相信一些编译器提供128位整数类型。在你得到非常大的数字之前,你在小学学到的方法在实践中会表现得更好。当然,您使用的基数大于10.:-)根据您的需要,2^32、2^64或10^9是方便的基数(10的幂很有用,因为解析/打印以10为基数的数字对优化很重要,10^9是适合32位的最大幂)。