我尝试编译并运行一些旧的C程序,这些程序是我在Windows上使用代码块开发的。
我从gcc没有错误,程序正确执行。仅在某些情况下(一些初始条件),我没有得到与以前相同的数值结果!我没有更改程序中的任何内容(除了^M
个字符)。
我首先想到的是因为两个scanf函数。但不是。我删除了它们并得到了同样的错误结果。
在将Windows C代码用于Linux之前,有没有人遇到过这种奇怪的行为?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "differentialeqsolve.h"
#define TINY 1.0e-30
/*----------------------------------------------------------------------------------------------*/
/*main*/
/*----------------------------------------------------------------------------------------------*/
int main(void){
/*miscellaneous variables*/
int i,k,dummy;
int N=4; /*nb equa diff +1 (we don't want to use f[0])*/
/*output files*/
char namefile[20]={0}; /*file for couplings*/
FILE * file[N];
/*Runge Kutta variables*/
double accuracy=1e-7; /*minimal precision required for values of f obtained by rk*/
double h=1.0e-7; /*initial step for RG (for the first iteration)*/
double htry,hdid,hnext; /*initial/effective/final step for rk5adapt*/
double t=0.; /*RG time*/
double limite=1.0e12; /*cutoff limit for the strong coupling*/
double U,J; /*lattice parameters for initial conditions*/
int NN; /*number of spin components*/
double thetamin,thetamax,dtheta;
double theta;
double R=0.1;
int n=100; /*number of points in the calculation around the ring*/
double f[N];
double df[N];
double fscal[N];
double g[N]; /*renormalized (by f1) couplings*/
/*opening output files*/
for (k = 1 ; k < N ; k++ )
{sprintf(namefile,"g%d.dat",k);
file[k]=fopen(namefile, "w");}
/*initialization of couplings f[]*/
NN=3;
thetamin = -0.1;
thetamax = 0.1;
dtheta=(thetamax-thetamin)/((float) n);
printf("dtheta=%.10lf\n",dtheta);
for(i=0;i<=n;i++){
theta=thetamin+i*dtheta;
U=R*cos(theta);
J=R*sin(theta);
/*initialization of table df[]*/
for(k=1;k<N;k++) df[k]=0;
f[1]=-2*NN*U-3*NN*J;
f[2]=-2*NN*U+NN*J+2*NN*NN*J;
f[3]=-2*NN*U+NN*J;
t=0.; /*initialization of RG time*/
/*initialization of RG time step for rk5adapt*/
htry=h;
/*calculation of the scaling to calculate precision*/
for(k=1;k<N;k++)
fscal[k]=fabs(f[k])+fabs(df[k]*htry)+TINY;
/* ********************************************************/
/*iteration of RG until at least one of the couplings reaches the cutoff "limite"*/
/* ********************************************************/
for(;;){
/*calculation of f(t+h) with rk5adapt*/
rk5adapt(f,df,N,NN,&t,htry,accuracy,fscal,&hdid,&hnext,dfunctions);
/*new time is readily set by rk5adapt*/
/*new step (set as hnext by rk5adapt)*/
htry=hnext;
/*new scaling fscal*/
for(k=1;k<N;k++)
fscal[k]=fabs(f[k])+fabs(df[k]*htry)+TINY;
/*Stop RG iteration when at least one of the couplings reaches the cutoff limit*/
for(k=1;k<N;k++)
{if(fabs(f[k])>=limite) {goto RGstop;}}
}
RGstop : if(f[1]>0) for(k=1;k<N;k++)
{
g[k]=f[k]/f[1];
fprintf(file[k],"%lf %lf\n",theta,g[k]);
}
else printf("%lf, g[1]<0\n",theta);
/*end theta*/
}
for ( k = 1 ; k < N ; k++ )
{
fclose(file[k]);
}
return 0;
}
答案 0 :(得分:1)
好的,我通过将TINY
参数(参见数字食谱中的Runge Kutta)设置为1e-25
来解决问题。在将其设置为1e-30
之前。
显然,我的编译器不会像我的旧编译器那样处理float和float操作。
在chux评论之后,我检查了FLT_EVAL_METHOD
的值0
。将它设置为2
会稍微改变我的微分方程的结果,但只有当我将TINY
设置为不同的值时我才能得到预期的结果。