平行,因为没有给出一致的结果

本文关键字:结果 因为 平行 | 更新日期: 2023-09-27 17:55:29

当我运行下面的代码时,结果总是不同的,当涉及到第 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 ) );
    }

我不知道为什么结果并不总是总计 = 6666666166,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 ) );

平行,因为没有给出一致的结果

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

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

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