Здесь есть небольшая проблема с кодом умножения матриц.Кажется, я теряю точность при умножении больших матриц (мой код отлично работает на маленьких матрицах).
Мой цикл выглядит следующим образом:
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;
}
}
Как вы можете видеть, я форсирую (double) точность, чтобы быть уверенным, что я не теряю точность при умножении двух моих чисел.
Глядя на код 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 думал, чтопоскольку я уже умножаю числа с плавающей запятой, он должен использовать не умножение с двойной точностью, а умножение с одинарной точностью, что дает мне ошибки, которые я отслеживал.
Я прав?Есть ли способ заставить это умножение двойной точности?
Спасибо