Parallel.For not not consistent results

时间:2016-07-06 12:51:49

标签: c# task-parallel-library

当我运行下面的代码时,结果总是与第5和第6位数字不同:

public void TestParallel()
    {
        object locker = new object();
        double grandTotal = 0;
        Parallel.For( 1, 1000000,

            () => 0.0, // Initialize the local value.

            ( i, state, localTotal ) => // Body delegate. Notice that it
            {
                return localTotal + Math.Sqrt( i ); // returns the new local total.
            },

            localTotal => // Add the local value
            {
                lock( locker ) grandTotal += localTotal; // to the master value.
            }
            );
        Console.WriteLine( string.Format( "Grand Total = {0}", grandTotal ) );
    }

我不知道为什么结果并不总是Grand Total = 666666166,458842。这就是我在运行它时得到的结果:

double grandTotal = 0;
for ( int i = 1; i < 1000000; i++ )
{
    grandTotal += Math.Sqrt( i ); // returns the new local total.
}
Console.WriteLine( string.Format( "Grand Total = {0}", grandTotal ) );

2 个答案:

答案 0 :(得分:2)

您得到的结果不一致,因为浮点运算会对数字进行舍入。而舍入取决于四舍五入的数字。

因此(0 + 1)+ sqrt(2)不能保证等于(0 + sqrt(2))+ 1.

答案 1 :(得分:2)

使用浮点计算,1.0 + 0.9并不总是等于0.9 + 1.0