Выход для последнего цикла не тот, который ожидается - PullRequest
0 голосов
/ 27 января 2019

Мне нужно умножить две матрицы, но получить разные выходные данные для последнего столбца выходной матрицы.Должна быть какая-то логическая ошибка, но я не могу ее обнаружить.

Я все еще не знаю, как отлаживать, вот почему.

    if(aCollumn == bRow) {
            for(i = 0; i < aCollumn; i++){
                    for(j = 0; j < bRow; j++) {
                            for(n = 0; n < aCollumn; n++){
                                    product = matrixA[i][n] * matrixB[n][j];
                                    sum += product;
                            }
                            matrixAB[i][j] = sum;
                            sum = 0;
                    }
            }
    }
    else {
            printf("Matrices are not compatible for multiplication. \n");
    }

1 Ответ

0 голосов
/ 27 января 2019

, когда вы умножаете длинное целое на длинное целое (со знаком 32 бита + 31 бит данных), результат может быть до 63 бит со знаком (31 + 31 = 62 + 1 бит для знака), а когда вы его накапливаете, диапазон становится еще больше , с log2 битами числа операций накопления. Ваш код не сообщает, являются ли matrixA и matrixB длинными или короткими целыми числами, но даже для коротких целых чисел накопление может вызвать переполнение. Вы можете защитить свой код с насыщением или с достаточно низкими значениями, но это требует больше информации. пожалуйста, обратитесь к 1 , если это ваш случай

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...