【问题标题】:Is it faster to detect almost zeros and replace them for 0.0 or leave them as small numbers?检测几乎为零并将它们替换为 0.0 或将它们保留为小数字会更快吗?
【发布时间】:2012-10-10 13:04:49
【问题描述】:

我正在编写一个数值分析程序,有时微积分会给出一些非常小的系数,即a0=1.234542e-12

如果我计算一个包含 10 个值的数组(其中 6 个是小数字),然后我将每个值乘以 t^x(仅作为示例) x=1:10,计算速度哪个更快?

  • 保持小数不变
  • 检测小于 threshold 的数字并将其替换为 0.0

这个问题主要是因为编译器可能只是没有计算一个数字乘以 0,因为它总是 0,或者它可能只是将它相乘,而我正在使程序变慢以添加 if 条件只是检查一个数字是否为 0。

【问题讨论】:

  • 对于一个由 10 个数字组成的数组,您将看不出任何区别。
  • 你应该重视正确性而不是速度。
  • 嗯,一个值乘以零是零,而一个值乘以一个小值是另一个小值。在长链计算中,最终结果可能会大不相同,具体取决于您是否将小值替换为零。
  • @Oded 是的,当然正确性高于速度,但是当我知道程序应该经常给我一个 1.0 时,它给我 1.00000001,即使精确正确的结果是 1.0(手动检查matlab),所以我猜测 1.0e-12 必须是一个数值微积分错误。随着时间的推移测试我的软件这种最小的数值错误,它们总是收敛到一个结果,而不是 0 也是 1.0e-12 的顺序(通常它们相乘或其他小值)。所以我的问题仍然是同一个方向。哪个更快?
  • 您还应该选择浮点运算行为(请参阅msdn.microsoft.com/en-us/library/e7s85ffb(v=vs.80).aspx - 适用于 Visual Studio,gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html 与浮点运算相关的标志 - 适用于 GCC)。

标签: c++ visual-studio-2008 math numerical-methods


【解决方案1】:

如果您问,这两个操作中哪个更快:

  1. 乘以一个数字向量,包括一些接近 0.0 的数字。
  2. 遍历设置为 0.0 的数字向量,那些接近 0.0 的数字,然后乘以向量。

嗯,我认为在限制中 1 会比 2 快。

【讨论】:

    【解决方案2】:

    我假设数组不是一个常数,而是你程序的中间结果。

    那么乘0和乘小数的速度就完全没有区别了,因为这两种情况下执行的机器码是完全一样的。编译器不知道数组的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 2016-01-05
      • 2014-05-28
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多