乌玛·赫尔法维
取决于这个问题浮点除法与浮点乘法。由于某些原因,除法比乘法慢。
如果可能的话,编译器通常会用乘法代替除法吗?
例如:
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默认编译器。但是,如果我得到一个通用答案(此优化的理论有效性),那就太好了
谢尔盖·卡里尼琴科(Sergey Kalinichenko)
不,在一般情况下,不允许编译器执行此操作:由于倒数的表示错误,这两个操作可能会产生位不相同的结果。
在您的示例中,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
演示
注意:正如njuffa在下面的注释中正确指出的那样,在某些情况下,编译器可以针对大量数字进行一些优化,如本文所述。例如,乘以或除以2的乘方等效于添加到IEEE-754float
表示的指数部分。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
编辑于
我来说两句