c - 重新排列方程式

标签 c performance math optimization floating-point

我的 C 代码中有以下等式

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

我知道浮点除法比乘法要昂贵得多,我已经为此苦苦思索了一段时间。有什么办法可以重新排列这个以减少 split 吗?

谢谢

最佳答案

请注意,在您实际尝试优化某些部分之前,您应该:

  • 确保它正确
  • 确保没有办法在更高级别优化它
    ~ 我的程序调用此计算的次数不是比实际需要的次数多吗?
    ~ 我可以使用之前的结果吗? ( What is dynamic programming? )
  • 一旦您知道瓶颈在哪里,基准测试应该遵循:
    ~ 它似乎很慢......它有多“慢”? ...它应该变得多“快”?

但如果您确定方程本身应该被优化,您可以利用 centre 的乘法逆元在方程中出现 4 次的事实,将除法次数减少到 1:

double centreInv = 1.0 / centre;
double pHoldToCentre = pHold * centreInv;
double result = 
    k * dl * (1.0 + pHoldToCentre 
              + 0.5 * pHoldToCentre * pHoldToCentre 
              - 0.5 * square * centreInv);

另请注意,此类更改实际上可能会影响此等式的结果,因此如果您决定更改它,请确保它仍会产生所需的输出。

关于c - 重新排列方程式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19350796/

相关文章:

javascript - GAS/Javascript 在汇总数字时给出错误的数字

python - 将所有数据框列转换为 float 的最快方法 - pandas astype slow

asp.net-mvc - 许多领域的 MVC 性能问题

algorithm - 奇怪但实用的二维装箱优化

c -++*p++的输出

c - 如何检查变量是否包含特定数字?

objective-c - 使用大位掩码的便捷方式

iphone - 如何使用 TouchXML 或其他替代方案解析 HTML

sql - 我如何加速此 SQL 查询?

javascript - 如何告诉 MathJax 对下标使用替代语法?