我并不是真的想要优化任何东西,但我记得我一直都是从程序员那里听到的,我把它当作一个真理。毕竟他们应该知道这些东西。
但我想知道为什么除法实际上比乘法慢?分裂只是一个美化的减法,乘法是一个美化的加法吗?因此,在数学上我不明白为什么以某种方式或另一种方式在计算上有非常不同的成本。
任何人都可以澄清其原因/原因,所以我知道,而不是我从其他程序员那里听到的,我之前询问的是:“因为”。
答案 0 :(得分:48)
CPU的ALU(算术逻辑单元)执行算法,尽管它们是在硬件中实现的。经典乘法算法包括Wallace tree和Dadda tree。有关更多信息,请here。更新的处理器中提供了更复杂的技术。通常,处理器努力并行化位对操作,以便最小化所需的时钟周期。乘法算法可以非常有效地并行化(尽管需要更多的晶体管)。
Division algorithms无法有效并行化。最有效的除法算法非常复杂(The Pentium FDIV bug表明了复杂程度)。通常,它们每位需要更多的时钟周期。如果您需要了解更多技术细节,here是英特尔的一个很好的解释。英特尔实际上patented他们的划分算法。
答案 1 :(得分:4)
但是我不知道为什么除法实际上比乘法慢?除法不只是光荣的减法,而乘法就是光荣的加法吗?
最大的区别是,在长乘法中,您只需要在移位和屏蔽后加一堆数字即可。在长除法中,每次减法后必须测试溢出。
让我们考虑两个n位二进制数的长乘法。
但是,如果我们仔细观察,我们可以使用两个技巧来优化加法(还有进一步的优化,但这是最重要的)。
所以现在我们的算法看起来像
换句话说,我们可以为两个n位数字建立一个与n大致成比例的乘数(和与n²大致成比例的空间)。只要CPU设计人员愿意献身于逻辑乘法,它的速度几乎可以与加法一样快。
在长除法中,我们需要确定每个减法是否溢出,然后才能决定将哪个输入用于下一个减法。因此,我们不能像长乘法那样应用相同的并行技巧。
有些除法比基本的长除法要快,但比乘法要慢。