乘法比浮点除法快吗
Is multiplication faster than float division?
在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处理器的优化指南提供了fdiv
和fmul
的数字,分别为42和6。SSE版本更接近,DIVPS、DIVPD DIVSS和DIVSD(除法)为24(单)或27(双)循环,所有形式的乘法为6个循环。
从内存来看,英特尔的数据并不遥远。
浮点乘法通常比浮点除法占用更少的周期。但是对于文字操作数,优化器非常清楚这种微观优化。
- 在除法中不需要四舍五入
- 在TFHE(完全快速同态加密)上执行除法
- 使用 int 表示浮点除法 C++
- 而循环:简单的除法程序输出零,不明白为什么
- 余数除法和不允许除以零 (c++) 时遇到问题
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 如何使用除法和for_each?
- C++:奇怪的除法输出
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- 除法函数返回错误的值
- 检查向量是否使用除法和阻抗算法进行排序
- 不使用算术运算符的除法
- C++编译器能在编译时计算出文字的除法结果吗
- 浮点 由于除法语句而导致的 c++ 异常
- 特征矩阵向量除法
- 在早期的 C 和 C++ 编译器中,手动位移位与乘法和除法的相关性如何?
- 用除法反转向量的元素
- 按运行时常量值重复整数除法
- 将 int 128 除法提升为浮点数
- 用于 3D 矢量的高效除法运算符