При кодировании умножения матриц в моей программе я получаю ошибки точности (неточные результаты для больших матриц).
Вот мой код. Текущий объект имеет данные, хранящиеся в уплощенном массиве, строка за строкой. В другой матрице 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;
}
}
}
}
}
На самом деле, код немного сложнее: я делаю умножение для нескольких кусков (поэтому вместо того, чтобы иметь значение i от 0 до размера, я иду от localStart к localStop), затем суммирую полученные матрицы.
Моя проблема: для большой матрицы я получаю ошибку точности:
NUnit.Framework.AssertionException: Error at (0,1)
expected: <6.4209571409444209E+18>
but was: <6.4207619776304906E+18>
Есть идеи?