ここで行列乗算コードに少し問題があります。大きな行列の乗算では精度が低下するようです(私のコードは小さな行列で正常に実行されます)。
私のループは次のとおりです:
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;
}
}
ご覧のとおり、2つの浮動小数点数を乗算するときに精度が失われないように、(倍精度)精度を強制します。
ILコードを見ると、2つの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は、すでにfloatを乗算しているので、倍精度乗算ではなく単精度乗算を使用する必要があると考えており、追跡しているエラーが発生していると思います。
私は正しいですか?この倍精度乗算を強制する方法はありますか?
ありがとう