【发布时间】:2010-04-27 12:22:01
【问题描述】:
在我的程序中编写矩阵乘法时,会出现精度错误(大型矩阵的结果不准确)。
这是我的代码。当前对象的数据逐行存储在展平数组中。其他矩阵 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 到 size,而是从 localStart 到 localStop),然后对结果矩阵求和。
我的问题:对于一个大矩阵,我得到精度错误:
NUnit.Framework.AssertionException: Error at (0,1)
expected: <6.4209571409444209E+18>
but was: <6.4207619776304906E+18>
有什么想法吗?
【问题讨论】:
-
也许使用
precision标签应该会自动打开那些经常出现在这些问题中的关于浮点数学的网页?
标签: c# matrix floating-point double precision