2015-02-08 2 views
-4

Я использую итерацию Jacobi, используя двойные значения. Ниже приведен расчет сниппет:Расчет с плавающей запятой C неправильный результат

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. Есть ли что-то об этих значениях с плавающей запятой, которые мне не хватает?

+1

Если вы используете C, не помещайте его в C++; вы можете получить ответы, которые полностью непригодны для использования на C - и наоборот. –

+0

Хорошо, будет помнить об этом. Спасибо – Sohi

+0

Вы попробовали отладить его? –

ответ

2

Я создал матрицу 2x10x10 и загрузил первую плоскость со 100 значениями в диапазоне 20..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] вашей матрицы, чтобы решить, какие значения должны быть там. Значения вокруг границы не изменяются, но если они начинаются с нуля, они вытягивают средние значения.

+0

Большое спасибо. Я инициализировал h [next] так же, как h [ток], и проблема была решена. Я потратил на это 15-20 часов. – Sohi

Смежные вопросы