C中的算术异常



算术异常

//m*n行列Aを用いてy = A*x +b を計算する
void fc(int m, int n, const float *x, const float *A, const float *b, float *y){
int i, j;
for (i = 0; i < m; i++){
y[i] = b[i];
for (j = 0; j < n; j++){
y[i] += A[i * n + j] * x[j];
}
}
}

这是一个对矩阵进行AX+b计算的代码。但正如照片中一样,出现了算术异常。为什么会发生这种情况?即使它是乘法,并且没有任何东西被0除。如何解决此错误?

很抱歉,我无法添加值,否则我将不得不在此处添加整个文件。这些是神经网络的参数,我必须在这里添加.dat文件,然后我还需要其他可以加载这些文件的代码。此外,我不知道如何只从.dat文件中提取数字,它们的编码有点奇怪,所以.

我会提供所有其他信息,否则,所以请不要关闭这个问题,我真的想知道为什么会发生这种情况,以及如何解决它。

这也是例外情况的另一个例子。示例

我想知道的是,即使在这个例子中没有除以0的东西,这种情况怎么会发生。我该如何解释这种情况。

根据您的图像,您的矩阵大小为100x50(m,n(,意味着5000项。但您输入了A[j*m+i],其中"j"等于55,"i"等于0。这意味着访问数组中不允许的5500项。

#include <stdio.h>
void fc(int m, int n, const float *x, const float *A, const float *b, float *y){
int i, j;
for (i = 0; i < m; i++){
y[i] = b[i];
for (j = 0; j < n; j++){
y[i] += A[i * n + j] * x[j];
}
}
}
int main()
{
const float x[3]={1,1,1};  
const float *xp=x;
const float A[3][3]={{1,1,1},{1,1,1},{1,1,1}};
const float b[3]={1,1,1};   
const float *bp=b;
float y[3]; float *yp=y;
fc (3,3,xp,*A,bp,yp);
printf("%f %f %f ",y[0],y[1],y[2]);
return 0;
}

我测试了这个程序,所有变量的虚值为1,矩阵大小为3x3和3x1。结果正确无误。结果是

4.0000000 4.0000000 4.0000000 

因此,问题不是由代码的结构引起的。它肯定来自一个特殊的算术问题。

最新更新