乘法比浮点除法更快吗?

在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; 这不太可能引起太多问题。

编辑:

仅供参考。 我通过在Google上searchfind了第三方比较操作时间的方法。

~tege/x86-timing.pdf

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

浮点乘法通常比浮点除法的周期更less。 但是对于字面操作数,优化器非常了解这种微观优化。

如果“认为”更快,编译器很可能会将分割转换为乘法。 在浮点除以2也可能比其他浮点除法更快。 如果编译器不转换它,使用乘法可能会更快,但不是确定的 – 取决于处理器本身。

在编译器无法确定它是“安全”的情况下,手动使用乘法而不是除法的增益可能非常大(例如0.1在浮点数中不能精确地存储为0.1,则它变为0.10000000149011612 )。 请参阅下面的AMD处理器数据,可以作为课程的代表。

为了告诉你的编译器是否做得好,为什么不写一点代码来做实验。 确保你编写它,以便编译器不只是计算一个常数值,并放弃循环中的所有计算。

编辑:

AMD针对Family 15h处理器的优化指南分别提供了fdivfmul – 42和6的数字。 对于DIVPS,DIVPD DIVSS和DIVSD(除),SSE版本稍微接近24(单)或27(双)循环,对于所有forms的乘法,6个循环。

从记忆来看,英特尔的数字并不遥远。