【发布时间】: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