【发布时间】:2014-08-07 04:54:11
【问题描述】:
有时我在算术运算中遇到这样的表达式:n*(1/k)。
这样的表达可以用更简单的方式表示:n/k。
我可以想象,在某些情况下,如果 (1/k) 代表众所周知的成分,前者可能更具描述性,但情况并非总是如此。 性能收益/损失呢?精度呢?
是否有一些开发者使用 n*(1/k) 形式的隐藏原因?
【问题讨论】:
-
如果正在执行多个计算,当然可以提高性能,但
1/k在所有计算中都很常见 - 乘法往往比除法具有更好的性能。 -
如果 n=3 且 k=3,n/k 给出正确答案,尽管 n*(1/k) 给出了近似答案。
-
我觉得这样写在数学里比较常见。
-
@ParagGangil 两种情况的结果差异可能表明编译器保留了表达式的形式,因此我们如何编写它很重要。当精度很重要时,您的论点足以让我避免 n*(1/k) 形式而支持 n/k。
-
k不需要保持不变。它只需要多次用作除数。如果你只有a/k,编译器会保持这种状态。如果你有a/k和b/k,那么计算r = 1/k会更快。然后a*r和b*r。这种优化可以手动完成,也可以由编译器完成(如果您允许它进行不安全的 FP 优化)。即使你把它写成a*(1/k)和b*(1/k),编译器也足够聪明,只做一次1/k。
标签: performance division multiplication arithmetic-expressions