为了提高准确性,我一直在尝试将程序从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给出的所有值。
答案 0 :(得分:2)
嗯,是的,long double
类型的文字值需要有L
后缀。因此,请使用2.0L
而不是2.0
(类型为double
)或2.0f
(类型为float
)。
但是,从错误消息中,您声称所有变量都为long double
是错误的。
至少有一个变量的类型为std::complex<long double>
,错误消息表明涉及一个或多个变量的操作不存在。
这意味着你不理解代码的作用。这意味着,将double
类型的所有内容更改为long double
并修复文字值的类型,将会有更多工作正常运行。
由于您没有提供足够的信息,因此无法提供更具体的建议。特别是,您需要提供一个小而完整的代码示例来说明您的问题。