这里的矩阵乘法代码有点问题。我似乎在大矩阵乘法上失去了精度(我的代码在小矩阵上运行良好)。
我的循环如下:
for (int j = 0; j < columns; j++)
{
float[] column = otherMatrix.Column(j);
for (int i = 0; i < rows; i++)
{
double s = 0;
for (int k = 0; k < size; k++)
s += this[i,k] * ((double) column[k]);
result[i, j] = (float)s;
}
}
如您所见,我强制使用(双)精度以确保在将两个浮点数相乘时不会丢失精度。
查看 IL 代码,我可以看到两个 conv.r8,这让我认为 IL 代码中有这种浮点到双精度的转换。
但是,在运行它并查看反汇编(x86 机器)时,我看到以下内容:
0000024e fld dword ptr [edx+eax*4+8]
00000252 fmulp st(1),st
00000254 fadd qword ptr [ebp-64h]
00000257 fstp qword ptr [ebp-20h]
这让我觉得 JIT 认为由于我已经在乘以浮点数,它不应该使用双精度乘法而是单精度乘法,这给了我一直在跟踪的错误。
我对吗 ?有没有办法强制这种双精度乘法?
谢谢