编译提供与Windows编译器不同的结果

时间:2014-12-21 11:39:00

标签: c linux windows compilation

我尝试编译并运行一些旧的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;

}

1 个答案:

答案 0 :(得分:1)

好的,我通过将TINY参数(参见数字食谱中的Runge Kutta)设置为1e-25来解决问题。在将其设置为1e-30之前。

显然,我的编译器不会像我的旧编译器那样处理float和float操作。

在chux评论之后,我检查了FLT_EVAL_METHOD的值0。将它设置为2会稍微改变我的微分方程的结果,但只有当我将TINY设置为不同的值时我才能得到预期的结果。