我为Jacobi迭代法编写了这个C程序,但我得到了Nan和无穷大作为我试图改变的输出 我得到Nan和无穷大作为输出,我尝试从float更改为double

我为Jacobi迭代法编写了这个C程序,但我得到了Nan和无穷大作为我试图改变的输出 我得到Nan和无穷大作为输出,我尝试从float更改为double,c,C,也许错误在于准确性 #include <stdio.h> #include <conio.h> #include <math.h> double u(double w,double x,double y,double z) { return ( (-22*x+2*y-4*z+3)/3); } double f(double w,double x,double y,double z) { return ((36*w+y-3*z-4)/2); }

也许错误在于准确性

#include <stdio.h>
#include <conio.h>
#include <math.h>

double u(double w,double x,double y,double z)
{
  return ( (-22*x+2*y-4*z+3)/3);
}

double f(double w,double x,double y,double z)
{
  return ((36*w+y-3*z-4)/2);

}

double s(double w,double x,double y,double z)
{
  return ((w-2*x-40*z+6)/4);

}

double t(double w,double x,double y,double z)
{
  return ((-2*w-3*x-38*y+8)/2);

}

void main()
{
  double w0,x0,y0,z0,w1=0,x1=0,y1=0,z1=0,tempw,tempx,tempy,tempz,acc=0.000001;
  int iteration=0;
  printf("Enter initial guesses:\n");
  scanf("%f%f%f%f",&w0,&x0,&y0,&z0);
  do
  {
    tempw=w1;
    tempx=x1;
    tempy=y1;
    tempz=z1;
    w1=u(w0,x0,y0,z0);
    x1=f(w0,x0,y0,z0);
    y1=s(w0,x0,y0,z0);
    z1=t(w0,x0,y0,z0);

    iteration++;
    w0=w1;
    x0=x1;
    y0=y1;
    z0=z1;
  }while(fabs(tempw-w1)>acc &&fabs(tempx-x1)>acc && fabs(tempy-y1)>acc 
      && fabs(tempz-z1)>acc);

  printf("\n\nFinally,\n");
  printf("w=%f Ans\nx=%f Ans\ny=%f Ans\nz=%f Ans\n",w1,x1,y1,z1);
  printf("Iteration=%d",iteration);
  getch();

}
#包括
#包括
#包括
双u(双w、双x、双y、双z)
{
返回(-22*x+2*y-4*z+3)/3);
}
双f(双w,双x,双y,双z)
{
返回((36*w+y-3*z-4)/2);
}
双s(双w、双x、双y、双z)
{
返回((w-2*x-40*z+6)/4);
}
双t(双w,双x,双y,双z)
{
返回(-2*w-3*x-38*y+8)/2);
}
void main()
{
双w0,x0,y0,z0,w1=0,x1=0,y1=0,z1=0,tempw,tempx,tempy,tempz,acc=0.000001;
int迭代=0;
printf(“输入初始猜测:\n”);
scanf(“%f%f%f%f”、&w0、&x0、&y0、&z0);
做
{
tempw=w1;
tempx=x1;
tempy=y1;
tempz=z1;
w1=u(w0,x0,y0,z0);
x1=f(w0,x0,y0,z0);
y1=s(w0,x0,y0,z0);
z1=t(w0,x0,y0,z0);
迭代++;
w0=w1;
x0=x1;
y0=y1;
z0=z1;
}而(晶圆厂(tempw-w1)>acc和晶圆厂(tempx-x1)>acc和晶圆厂(tempy-y1)>acc
&&晶圆厂(tempz-z1)>acc;
printf(“\n\n最终,\n”);
printf(“w=%f Ans\nx=%f Ans\ny=%f Ans\nz=%f Ans\n”,w1,x1,y1,z1);
printf(“迭代=%d”,迭代);
getch();
}

您正试图使用用于
float
的转换说明符读入
double
s。 这可能导致未定义的行为

scanf("%f%f%f%f",&w0,&x0,&y0,&z0);
您需要使用
%lf
而不是
%f

一些具有适当选项的编译器将发出警告(GCC使用
-Wall
选项执行此操作)

C标准规定:

如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义


抱歉,如果它写得不好,这是我第一次在这里发布评论
double w0,x0,y0,z0;scanf(“%f%f%f%f”、&w0、&x0、&y0、&z0)启用所有编译器警告。
warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double *' [-Wformat=]    
   scanf("%f%f%f%f",&w0,&x0,&y0,&z0);

          ~^        ~~~    
          %lf