在c ++中从double变为long double不再能给出正确的结果

时间:2015-04-02 12:14:08

标签: c++ double long-integer precision long-double

为了提高准确性,我一直在尝试将程序从double升级为long double。但是,我收到了以下错误。

  

haread.cpp:178:43:错误:'2.0e + 0 *中'运营商*'不匹配   std :: operator + [with _Tp = long double](((((const std :: complex )KEp)+((long unsigned int)((long unsigned int)i)*   32ul)))),((const std :: complex )(& energia)

该行是

  

phicheb [1] [i] =(2.0 *(KEp [i] + energia)/ dE)-phistate [is] [i];

使用' new'动态定义数组。所有变量都是长的两倍。当一些数字乘以复数数组时,所有情况都获得了问题。所以,我把2.0改为2.0L和所有类似的情况。所以,现在编译成功了。但是,我的程序不再正常工作。我是否需要为我定义的所有长双打后缀?我已将它们定义如下:

  

long double xmin = 1.6;   long double xmax = 7.0;

我甚至不确定从哪里开始。有什么建议? 编译器是gcc版本4.6.2(SUSE Linux)。 编辑:

for ( int is = 0 ; is < nstates ; is++ ){
        for ( int i = 0 ; i < xgrid ; i++ ) phi[i] = phistate[is][i];
        fft(&phi[0], &kphi[0], -1);
        for ( int i = 0 ; i < xgrid ; i++ ){
                kphi[i] = akx2[i]*kphi[i]*ixgrid; //calculates the KE using Fourier transform
        }
        fft(&kphi[0],&KEp[0],1);
        for ( int i = 0 ; i < xgrid ; i++ ){
                x = xmin + (i*dx) ;
                energia = complex<long double>(0.0,0.0);
                energia = hmatrix[is][is][i]*phistate[is][i] ; //Potential energy
                phicheb[0][i] = phistate[is][i];
                phicheb[1][i] = (2.0L*(KEp[i] + energia)/dE)-phistate[is][i] ;
        }
        for ( int j = 2 ; j < ncheb ; j++ ){ //this is a recursion relation
                for ( int i = 0 ; i < xgrid ; i++ ) phi[i] = phicheb[j-1][i];
                fft(&phi[0], &kphi[0], -1);
                for ( int i = 0 ; i < xgrid ; i++ ){
                        kphi[i] = akx2[i]*kphi[i]*ixgrid;
                }
                fft(&kphi[0],&KEp[0],1) ;
                for ( int i = 0 ; i < xgrid ; i++ ){
                        x = xmin + (i*dx) ;
                        energia = complex<long double>(0.0,0.0);
                        energia = hmatrix[is][is][i]*phi[i];
                        phicheb[j][i] = (2.0L*((2.0L*(KEp[i] + energia)/dE) - phicheb[j-1][i])) - phicheb[j-2][i]; //recursion
                }
        }
        for ( int i = 0 ; i < xgrid ; i++){
                for ( int j = 0 ; j < ncheb ; j++ ){
                        phistate_new[is][i] += chebc[j]*phicheb[j][i] ;
                }
        }
}

这是代码的核心。它用于在网格上传播波浪。我将尝试解释代码尽可能不太技术化。我有phistate [0] [i]的值,它是对应于基态的波函数(其余状态都为零)。然后我计算系统的能量(使用傅里叶变换的动能和已经给出的势能)。现在,使用特定方法(Chebychev方法),我及时传播波函数。此方法基于递归关系。在该递归中,使用多项式展开来计算传播。 Chebc是长双系数,其值很明确。所有未定义的变量都是长的。

当我使用double而不是long double时,我没有问题得到结果。当使用long double时,我的结果是phistate_new,它具有NaN给出的所有值。

1 个答案:

答案 0 :(得分:2)

嗯,是的,long double类型的文字值需要有L后缀。因此,请使用2.0L而不是2.0(类型为double)或2.0f(类型为float)。

但是,从错误消息中,您声称所有变量都为long double是错误的。

至少有一个变量的类型为std::complex<long double>,错误消息表明涉及一个或多个变量的操作不存在。

这意味着你不理解代码的作用。这意味着,将double类型的所有内容更改为long double并修复文字值的类型,将会有更多工作正常运行。

由于您没有提供足够的信息,因此无法提供更具体的建议。特别是,您需要提供一个小而完整的代码示例来说明您的问题。