浮点计算C错误结果

Floating-point calculation C wrong result

我正在尝试使用双精度值进行 Jacobi 迭代。以下是计算片段:

int current = 0, next = 1, k, temp;
for (k = 0; k < T; k++) {
    for (i = 1; i < N-1; i++)
        for (j = 1; j < N-1; j++)
            h[next][i][j] = 0.25 * (h[current][i-1][j] + h[current][i+1][j] +
                                    h[current][i][j-1] + h[current][i][j+1]);

    temp = current; // swap values of current and next
    current = next;
    next = temp;
}

所有初始值都在 20 到 100 之间,所以我应该在该范围内得到答案,但我得到的很多值都小于 20。这些浮点值有什么问题吗?不见了?

我创建了一个 2x10x10 矩阵,并在 运行ge 20..100 中加载了具有 100 个值的第一个平面。我打印出来了。

 81.00 66.00 49.00 97.00 52.00 32.00 89.00 67.00 43.00 63.00
 32.00 25.00 73.00 91.00 34.00 90.00 87.00 96.00 41.00 72.00
 64.00 24.00 50.00 91.00 35.00 32.00 33.00 93.00 66.00 81.00
 51.00 37.00 59.00 60.00 30.00 50.00 90.00 91.00 60.00 31.00
 33.00 89.00 73.00 30.00 55.00 49.00 34.00 31.00 22.00 44.00
 77.00 24.00 49.00 40.00 97.00 40.00 53.00 77.00 47.00 36.00
 66.00 40.00 98.00 29.00 82.00 52.00 46.00 20.00 38.00 84.00
 47.00 83.00 21.00 98.00 51.00 26.00 33.00 77.00 81.00 91.00
 20.00 92.00 90.00 55.00 81.00 30.00 92.00 25.00 99.00 25.00
 20.00 95.00 22.00 46.00 38.00 29.00 89.00 96.00 71.00 95.00

然后我运行循环一次并打印出新矩阵。结果是:

  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00
  0.00 48.75 53.75 73.75 67.00 46.25 77.00 72.00 69.25  0.00
  0.00 44.00 61.75 59.00 46.75 52.00 75.50 71.50 68.75  0.00
  0.00 55.75 55.00 52.50 50.00 50.25 52.00 68.50 52.50  0.00
  0.00 41.75 56.75 57.00 51.50 44.75 55.75 56.00 45.50  0.00
  0.00 63.75 58.75 51.25 54.25 62.75 49.25 37.75 43.25  0.00
  0.00 67.75 34.75 79.50 57.25 48.50 39.50 59.50 58.00  0.00
  0.00 50.00 92.25 39.00 71.75 41.50 60.25 39.75 76.25  0.00
  0.00 72.00 47.50 78.75 43.50 57.00 44.25 91.00 50.50  0.00
  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00

一旦在平均过程中使用了边缘周围的那些零,值就会低于 20。在第 10 次迭代之后,矩阵为:

 81.00 66.00 49.00 97.00 52.00 32.00 89.00 67.00 43.00 63.00
 32.00 18.37 33.83 29.56 33.95 35.10 30.59 34.63 22.12 72.00
 64.00 30.39 39.09 46.96 44.80 43.59 46.86 43.94 29.90 81.00
 51.00 28.89 43.03 45.77 48.12 49.18 46.14 41.18 32.27 31.00
 33.00 32.54 43.42 46.96 51.67 48.78 48.37 43.41 28.15 44.00
 77.00 32.32 43.48 50.88 47.04 52.33 46.00 43.74 32.51 36.00
 66.00 28.82 47.41 40.65 51.60 44.21 48.91 43.45 33.35 84.00
 47.00 34.35 31.64 46.19 37.77 45.88 42.86 49.11 31.50 91.00
 20.00 13.57 32.95 22.67 31.39 30.35 34.15 31.62 25.91 25.00
 20.00 95.00 22.00 46.00 38.00 29.00 89.00 96.00 71.00 95.00

里面有一个值18.37和一个值13.57。因此,您需要查看矩阵 h[1] 平面的边界,以确定其中应包含哪些值。边界周围的值没有改变,但如果它们一开始为零,它们就会拉低平均值。