【问题标题】:Practices for scientific programming [closed]科学编程的实践[关闭]
【发布时间】:2012-02-17 16:55:25
【问题描述】:

我想在速度和准确性方面写出好的陈述。如果我没记错这一行:b=(a+1)*a 会产生比这更好的程序:b=(a^2+a)

这只是一个示例,可能是错误的,但现在无关紧要,问题是:我在哪里可以找到科学计算的良好实践纲要?

【问题讨论】:

  • 我的目标是可读性。只有当你有证据表明它还不够好时,优化才是重点。编译器为你做了很多:)
  • 不幸的是,除了可读性之外,还需要考虑数值稳定性,在这种情况下,可读版本应该在 cmets 中。
  • a^2a*a 不是同一个东西。
  • 关于准确性,最重要的是good understanding of floating-point arithmetic
  • @MarcoS:前者是异或运算;后者是产生指数运算的乘法,相当于std::pow(a, 2)。在 C++ 中,就是这样。你的问题被标记为c++

标签: c++ math optimization


【解决方案1】:

这不是通常的“过早优化”讨论。这与性能无关;问题在于准确性。我同意 OP - 非常值得关注。

最值得关注的是accumulation of rounding error

如果可以的话,您应该在添加数组之前按升序对数组进行排序:

http://www.ibiblio.org/pub/languages/fortran/ch4-9.html

您可能会找到以下帮助:

http://www.codeproject.com/Articles/25294/Avoiding-Overflow-Underflow-and-Loss-of-Precision

您需要阅读What Every Computer Scientist Should Know About Floating Point Arithmetic

【讨论】:

    【解决方案2】:

    环顾https://scicomp.stackexchange.com/ 或者甚至在那里询问可能会让您受益匪浅。

    祝你好运!

    【讨论】:

      【解决方案3】:

      您可以查看Numerical Recipes in C。我不确定它是否介绍或教你优化,但就 C 科学计算而言,它是一本非常受欢迎的书。甚至可能有一本关于 C++ 的书。

      【讨论】:

      • @Zhenya:太好了!我一直在寻找类似的东西。
      • Numerical Recipes 是一本很棒的书,是我的最爱之一,但它的主要关注点是计算机上的线性代数、FFT 等算法、编写特殊函数、求解常微分方程和偏微分方程等。起来,但不要认为这是一本关于你的问题的书。
      【解决方案4】:

      一种有用的技术是在基准类型上制作所有函数模板,然后使用区间算术类型而不是浮点类型运行算法。这为您提供了给定输入集结果准确性的上限,而无需进行广泛的数值分析。

      了解您的结果和任何中间体的预期大小也很重要,这样您就可以快速判断是否有问题。

      【讨论】:

        【解决方案5】:

        你在这里做的事情叫做premature optimization,它是万恶之源。你应该做的是,编写你的程序,然后profile他们,并尝试优化关键部分。完整的科学计算优化技术纲要很可能是一本很厚的书,因此您需要在寻找解决方案之前缩小问题范围。

        【讨论】:

        • -1 您似乎错过了这里的重点-大多数做法都与“速度和准确性”的准确性部分有关,而确保程序产生的并不是过早的优化正确的结果。
        • 确实如此。过早的优化是一回事;避免仔细的初始设计来代替生成正确程序(即使用适当数据结构并产生准确/正确的数学输出)是另一回事。有一个平衡点。请注意,我不完全确定这个问题属于哪一边。
        • +1 @LightnessRacesinOrbit 我同意你上面写的。当涉及到数值稳定性等时,最好让事情尽可能简单,直到表明需要复杂性。关键通常是甚至不要尝试自己编写代码,而是依赖已经提供几乎任何你想要的东西的数字专家。例如@Sriram 的回答
        猜你喜欢
        • 2011-02-22
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 1970-01-01
        • 2010-09-28
        • 2013-01-29
        • 1970-01-01
        相关资源
        最近更新 更多