编译器会将除法优化为乘法

时间:2016-02-19 13:14:36

标签: c++ c++11 floating-point compiler-optimization

取决于这个问题Floating point division vs floating point multiplication。由于某些原因,除法比乘法慢。

如果可能的话,编译器通常会用乘法替换除法吗?

例如:

float a;
// During runtime a=5.4f
float b = a/10.f;

会不会是:

float a;
// During runtime a=5.4f
float b = a*0.1f;

如果它被认为是编译器可靠的问题,我使用VS2013默认编译器。但是,如果我得到一个通用的答案(这种优化的理论有效性),那就太好了

1 个答案:

答案 0 :(得分:20)

不,编译器不允许对一般情况执行此操作:由于倒数的表示错误,这两个操作可能会产生不相同的结果。

在您的示例中,0.1没有float的确切表示。这导致乘以0.1并除以10的结果不同:

float f = 21736517;
float a = f / 10.f;
float b = f * 0.1f;
cout << (a == b) << endl; // Prints zero

Demo.

注意:正如njuffa正确地在下面的评论中注明,有些情况下编译器可以对一组广泛的数字进行一些优化,如在this paper中描述。例如,乘以或除以2的幂相当于添加到IEEE-754 float表示的指数部分。