"-nan"是什么意思,是什么原因造成的?



我知道nan的意思是"不是一个数字",但是这段代码使用高斯消除算法输出"-nan":

#include <bits/stdc++.h> 
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=55;
const double eps=1e-7;
int n;
struct mat {
int l,c;
double p[N][N];
double* operator [] (int i) {return p[i];}
}a;
bool flo0(double &x) {return (fabs(x)<=eps)?1:0;}
void REF() {
for(int i=1;i<=n;i++) {
int flag=i;
for(int j=i;j<=n;j++) {
if(fabs(a[j][i])>fabs(a[flag][i])) flag=j;
}
for(int j=1;j<=n+1;j++) swap(a[flag][j],a[i][j]);
if(flo0(a[i][i])) continue;
for(int j=i+1;j<=n;j++) {
double t=a[j][i]/a[i][i];
for(int k=i;k<=n+1;k++) {
a[j][k]-=t*a[i][k];
}
}
}
}
void RREF() {
for(int i=n;i>=1;i--) {
if(flo0(a[i][i])) continue;
for(int j=n+1;j>=i;j--) a[i][j]/=a[i][i];
for(int j=i-1;j>=1;j--) {
double t=a[j][i];
for(int k=n+1;k>=1;k--) {
a[j][k]-=t*a[i][k];
}
}
}
bool no=false,many=false;
for(int i=1;i<=n;i++) {
int t=0;
for(int j=1;j<=n;j++) if(flo0(a[i][j])==false) ++t;
if(t==0 && flo0(a[i][n+1])==false) no=true;
if(t==0 && flo0(a[i][n+1])) many=true;
}
if(no) printf("-1");
else if(many) printf("0");
else for(int i=1;i<=n;i++) {if(flo0(a[i][n+1])) a[i][n+1]=0.0;printf("x%d=%.2lfn",i,a[i][n+1]);}
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
for(int j=1;j<=n+1;j++) {
cin>>a[i][j];
}
}
REF();
RREF();

return 0;
}

我无法获得输入,但输出是

x1=-nan
x2=-nan
x3=-nan
x4=-nan
x5=-nan
x6=-nan
x7=-nan
x8=-nan
x9=-nan
x10=-nan
x11=-nan
x12=-nan
x13=-nan
x14=-nan
x15=-nan
x1...

我最初认为原因是我在确定双精度是否等于 0 时没有使用"eps",但在我添加后,错误仍然存在。 我无法从谷歌获得有关"-nan"的任何信息。

它是一个非数字值,在符号位中具有负表示形式,您的运行时已决定将其显示为"负 nan"。

当程序工作时,p[i][j]中的值溢出并得到infinf/inf导致nan.

最新更新