【问题标题】:Is there a reason to use arithmetic expression n*(1/k) over n/k? [duplicate]是否有理由在 n/k 上使用算术表达式 n*(1/k)? [复制]
【发布时间】: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/kb/k,那么计算r = 1/k 会更快。然后a*rb*r。这种优化可以手动完成,也可以由编译器完成(如果您允许它进行不安全的 FP 优化)。即使你把它写成a*(1/k)b*(1/k),编译器也足够聪明,只做一次1/k

标签: performance division multiplication arithmetic-expressions


【解决方案1】:

对我来说,我发现使用 n*(1/k) 会得到一个不太准确的答案,因为当控制解决 an 时会产生 (1/k) 的结果将是可能导致四舍五入或修剪结果的情况,这可能导致准确性损失。在乘法过程中,损失的幅度会增加。因此,就我而言,我会说 n/k 更好

【讨论】:

  • 有时速度比精度更重要。阅读 cmets 上的链接。 x*rsqrt(x) 会比 sqrt(x) 快很多
  • 我讲述了我对精度的看法。我知道它只回答了一半的问题。我不知道性能问题。与其给出错误的指示,不如干脆离开。
  • 它仍然没有回答这个问题。 OP 询问了使用它的原因,而不是为什么你不应该使用它
  • 阅读问题老兄.....他问类似精确度怎么样?我回答了这个问题。我希望有人能尽快给出完整的答案。
  • 阅读问题老兄。他问“是否有理由使用算术表达式 n*(1/k) 而不是 n/k?” 其他问题是使用该表达式的原因
猜你喜欢
  • 2010-11-04
  • 2012-12-10
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多