Кодирование умножения матрицы в моей программе, я получаю точность ошибок (неточные результаты для больших матриц).Прецизионная ошибка при умножении матрицы
Вот мой код. Текущий объект имеет данные, хранящиеся в сплющенном массиве, строка за строкой. Другая матрица B имеет данные, хранящиеся в сплющенном массиве, после столбца (поэтому я могу использовать арифметику указателей).
protected double[,] multiply (IMatrix B)
{
int columns = B.columns;
int rows = Rows;
int size = Columns;
double[,] result = new double[rows,columns];
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < columns; col++)
{
unsafe
{
fixed (float* ptrThis = data)
fixed (float* ptrB = B.Data)
{
float* mePtr = ptrThis + row*rows;
float* bPtr = ptrB + col*columns;
double value = 0.0;
for (int i = 0; i < size; i++)
{
value += *(mePtr++) * *(bPtr++);
}
result[row, col] = value;
}
}
}
}
}
На самом деле, код немного сложнее: я делаю умножение вещи на несколько кусков (так вместо того, чтобы я от 0 до размера, я иду от localStart к localStop), а затем суммировать полученные матрицы ,
Моей проблема: для большой матрицы я получаю ошибку точности:
NUnit.Framework.AssertionException: Error at (0,1)
expected: <6.4209571409444209E+18>
but was: <6.4207619776304906E+18>
Любой идею?
Возможно, использование тега 'precision' должно автоматически открыть эту веб-страницу о математике с плавающей запятой, которая часто возникает в этих вопросах? – Skizz