Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++;? 我想知道C++中用什么方法来乘数。是传统教科书上的长乘法吗_C++_C_Algorithm_Math - Fatal编程技术网

整数在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。您似乎忽略了几个关键点:

  • native算法和bignum算法之间存在差异
  • 您似乎对bignum算术感兴趣
  • C++不支持bignum算术。基本数据类型通常是处理器的本地算法
  • 要获得bignum(任意精度)算法,您需要自己实现它或使用库。(例如)不像java和C++(其中的其他),C++没有用于任意精度算术的库。 所有这些奇特的算法:

    • 喀拉祖巴:
      O(n^1.585)
    • 图姆·库克:
    • 基于FFT的:
      ~O(n log(n))
    仅适用于在bignum库中实现的bignum算法。处理器用于本机算术运算的内容有些不相关,因为它是 通常是恒定的时间



    无论如何,我不建议您尝试实现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位的最大幂)。