C 中的算术异常
Arithmetic exception in C
Arithmetic Exception
//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 文件中提取数字,它们的编码有点奇怪,所以。
否则我会提供所有其他信息,所以请不要关闭这个问题,我真的很想知道为什么会这样以及如何解决它。
这也是异常的另一个例子。
Example
我想知道的是,即使在这个例子中没有除以 0,怎么会发生这种情况。我该如何解释这种情况。
#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
所以问题不是出在你的代码结构上。绝对是一道特殊的算术题
根据您的图片,您的矩阵大小为 100x50 (m,n),这意味着 5000 项。但是您输入了 A[j*m+i]
,其中 'j' 等于 55,'i' 等于 0。这意味着访问数组的第 5500 项是不允许的。
Arithmetic Exception
//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 文件中提取数字,它们的编码有点奇怪,所以。
否则我会提供所有其他信息,所以请不要关闭这个问题,我真的很想知道为什么会这样以及如何解决它。
这也是异常的另一个例子。 Example
我想知道的是,即使在这个例子中没有除以 0,怎么会发生这种情况。我该如何解释这种情况。
#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
所以问题不是出在你的代码结构上。绝对是一道特殊的算术题
根据您的图片,您的矩阵大小为 100x50 (m,n),这意味着 5000 项。但是您输入了 A[j*m+i]
,其中 'j' 等于 55,'i' 等于 0。这意味着访问数组的第 5500 项是不允许的。