【问题标题】:Checking Numerical Precision in Algorithms检查算法中的数值精度
【发布时间】:2013-03-27 17:37:13
【问题描述】:

在算法中检查数值精度的最佳做法是什么? 是否有任何建议的技术来解决“我们如何知道我们计算的结果是正确的”这个问题? 如果可能:是否有一些 C++ 中数值精度增强的例子?

感谢您的任何建议!

【问题讨论】:

  • int types = 100% 精度支持整数数字区间。浮点类型 = 仅支持一小部分有理数。有理数的任意精度(您可以从中选择)是通过将这些存储为 2 个整数的各种库实现的,有时称为“小数”或“小数”
  • @deathApril - 3/2 == 1 不是 100% 的精度。只是程序员已经学会了期望。不幸的是,他们通常对浮点的了解还不够,无法知道从 3.333 * 3.0 这样的表达式可以得到什么。
  • @PeteBecker 3/2 == 1integer division,余数为 1。
  • @deathApril - 是的,很明显。您在浮点算术中看到的任何“异常”对于浮点算术都是正确。正如我所说,大多数程序员只是对浮点运算知之甚少,无法做到正确。
  • @deathApril: 3/2==1 因为位数有限,特别是小数部分的 0 位。浮点数的小数部分的位数是可变的(这就是它不是固定点的原因),但即使这个可变位数仍然是有限的。

标签: c++ algorithm numerical


【解决方案1】:

Math::BigFloat / Math::BigInt 会有所帮助。我必须说有很多图书馆可以做到这一点,我不知道哪个是最好的。也许其他人对你有一个很好的答案。

一般情况下,您可以编写两次:一次具有无限精度,一次没有,然后验证两者。这就是我使用我编写的科学软件所做的。然后我会写第三个来提高速度。这样我就可以验证所有三个。请注意,我知道这三个不会完全相等,但它们应该有足够的佐证有效数字。

要真正知道准确地获得多少误差——记住浮点数的运算顺序会导致很大的差异。这确实是特定于问题的,但是如果您知道某些数字的相对大小,则可以更改操作顺序以获得准确性(例如,将列表按排序顺序相乘)。寻找调查的两个地方是,

【讨论】:

    【解决方案2】:

    看看区间算术,例如

    http://www.boost.org/doc/libs/1_53_0/libs/numeric/interval/doc/interval.htm

    它将产生结果的上限和下限

    PS:也可以看看http://www.cs.cmu.edu/~quake/robust.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-20
      • 2015-04-11
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多