在线程应用程序中将部分和中的和除去时的精度

时间:2016-11-02 14:37:26

标签: math pthreads precision numerical-methods

我正在编写使用float类型进行求和的C ++ / C代码。我知道我可以使用double或long double但是现在我正在测试float。我比较了两个实现,一个单线程,其中整个总和一次执行,另一个线程实现,其中部分总和,然后在所有线程完成时在末尾求和。即使测试系列非常小,我也会得到0.0001数量级的差异(总共20个数字,只是为了测试)。这让我感到惊讶。获得差异是可以理解的,但我希望它们更小。人们可能会怀疑一个错误,但是,这两个实现提供了一致的结果,最多3位小数。你怎么想,这是合理的,还是我应该找一个bug?哪种实现更准确?

2 个答案:

答案 0 :(得分:2)

浮点数的总和值取决于求和顺序。可能你遇到过这个问题。

如果求和过程从较小的量值开始,则可以提供更好的精度(减少数值误差)。

存在更多高级方法 - Kahan summation

答案 1 :(得分:0)

我知道您想使用float进行测试。但是为了确认你是否有bug,我只是将你的变量改为double,试一试并检查结果。如果double的结果是OK,则表示您没有错误。如果double的结果也差异很大,那你就有一个bug。
然后做完测试后你可以回去漂浮。
顺便说一句,我认为即使只有20个数字也可以得到这样的差异。