乘法比浮点除法快吗

Is multiplication faster than float division?

本文关键字:除法      更新时间:2023-10-16

在C/C++中,您可以设置以下代码:

double a, b, c;
...
c = (a + b) / 2;

这与完全相同

c = (a + b) * 0.5;

我想知道用哪个更好。一种操作是否从根本上比另一种更快?

乘法比除法快。在大学里,我被教导除法需要乘法的六倍。实际的时序取决于体系结构,但通常乘法永远不会比除法慢,甚至慢。如果四舍五入误差允许,请始终优化代码以使用乘法。

所以在一个例子中,这通常会更慢。。。

for (int i=0; i<arraySize; i++) {
    a[i] = b[i] / x;
}

比这个。。。

y=1/x;
for (int i=0; i<arraySize; i++) {
    a[i] = b[i] * y;
}

当然,对于舍入误差,使用第二种方法会降低(一点)精度,但除非重复计算x=1/x;,否则不太可能引起太大问题。

编辑:

仅供参考。我在谷歌上搜索到了一个第三方对操作时间的比较。

http://gmplib.org/~tege/x86-timing.pdf

查看MUL和DIV上的数字。这表示5到10倍之间的差异,具体取决于处理器。

在这种情况下,编译器很可能会将除法转换为乘法,如果它"认为"它会更快。在浮点中除以2也可能比其他浮点除法更快。如果编译器不转换它,使用乘法可能会更快,但不确定——这取决于处理器本身。

在编译器无法确定这样做是"安全的"的情况下,手动使用乘法而不是除法会带来很大的收益(例如,0.1不能像浮点数字中的0.1一样精确存储,它变成了0.10000000149011612)。有关AMD处理器的图则,请参阅下文,这些图可以作为类的代表。

为了判断你的编译器是否做得好,你为什么不写一些代码来进行实验呢。一定要写它,这样编译器就不会只计算一个常数值,并放弃循环tho中的所有计算。

编辑:

AMD针对系列15h处理器的优化指南提供了fdivfmul的数字,分别为42和6。SSE版本更接近,DIVPS、DIVPD DIVSS和DIVSD(除法)为24(单)或27(双)循环,所有形式的乘法为6个循环。

从内存来看,英特尔的数据并不遥远。

浮点乘法通常比浮点除法占用更少的周期。但是对于文字操作数,优化器非常清楚这种微观优化。