c++ - 在 C++ 中从 double 更改为 long double 不再给出正确的结果

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

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

haread.cpp:178:43: error: no match for ‘operator*’ in ‘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”动态定义的。所有变量都是 long double。当某个数字乘以复数数组时,所有情况都会出现该问题。所以,我将 2.0 更改为 2.0L 以及所有类似的情况。所以,现在编译成功了。但是,我的程序不能再正常工作了。我是否需要为我定义的所有长 double 添加后缀 L?我将它们定义如下:

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] 的值,它是对应于基态的波函数(其余状态均为零)。然后我计算系统的能量(使用傅立叶变换的动能和势能已经给出)。现在,使用一种特定的方法(切比雪夫方法),我及时传播波函数。该方法基于递归关系。在此递归中,传播是使用多项式展开计算的。 Chebc 是长 double 系数,其值定义明确。所有未显示定义的变量都是long double。

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

最佳答案

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

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

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

这意味着您不理解代码的作用。这意味着让它正常工作比更改所有 double 类型的东西要多得多。至 long double , 并固定文字值的类型。

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

关于c++ - 在 C++ 中从 double 更改为 long double 不再给出正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29412717/

相关文章:

c++ - WinPcap 的链接器错误

c++ - 无法为 ocx 注册输出错误

java - 在Java中如何缩短长十进制数?

android - 从 Long 格式转换为日期格式

java - 为什么带有波形符的移位整数掩码转换为长整型会返回零? (Java,位移位)

c++ - 什么是 C++ 中的可追踪指针?

c++ - 如何尽快实现strlen

matlab - 将单元格转换为 double

java - 当给定高值时程序崩溃

PHP SoapClient - 带有长整数的 SOAP 请求