我的C代码中有以下等式

k * dl * (1.0 + pHold / centre
       + (pHold * pHold) / (2.0 * centre * centre)
       - square / (2.0 * centre))

我知道浮点除法比乘法要贵得多,我已经花了一段时间在这上面了。有没有什么办法可以重新安排这个来划分?
谢谢

最佳答案

如果你看分数的分母,你会发现做一个共同的分母只允许你做一次除法(牺牲更多的乘法):

k * dl * (1.0
  + pHold                  / (centre)
  - square                 / (2.0 * centre)
  + (pHold * pHold)        / (2.0 * centre * centre)
)

如果确定浮点乘法优于浮点除法,则:
k * dl * (1.0
  + (pHold * 2.0 * centre) / (2.0 * centre * centre)
  - (square * centre)      / (2.0 * centre * centre)
  + (pHold * pHold)        / (2.0 * centre * centre)
)

变成:
k * dl * (1.0
  + ( (pHold * 2.0 * centre)
    - (square * centre)
    + (pHold * pHold) )     / (2.0 * centre * centre)
)

07-24 19:29