2015-04-02 59 views
0

爲了提高精度,我一直在試圖將程序從雙倍升級到長倍。但是,我得到了以下錯誤。在C++中由雙倍變爲長倍不再給出正確結果

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] ;

將陣列動態定義了使用 '新'。所有的變量都是雙重的。對於所有情況,當某個數字乘以複數組時,問題就得到了解決。所以,我將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] ; 
       } 
     } 
} 

這是代碼的核心。它用於在網格上傳播wavefuction。我會盡量解釋代碼儘可能少技術。我有phistate [0] [i]的值,這是對應於基態的波函數(其餘狀態都爲零)。然後我計算系統的能量(使用傅里葉變換的動能和已經給出的勢能)。現在,使用特定的方法(Chebychev方法),我及時傳播波函數。此方法基於遞歸關係。在這個遞歸中,傳播是使用多項式展開來計算的。 Chebc是很長的double係數,其值很好地定義。所有沒有顯示定義的變量都是雙倍的。

當我使用雙倍而不是長雙倍,我沒有問題得到的結果。當使用long double時,phistate_new,我的結果,具有由NaN給出的所有值。

+4

提供一個可重現問題的最小的,可編譯的代碼? – coyotte508 2015-04-02 12:17:45

+0

你能比「無法正常工作」更具體嗎? – molbdnilo 2015-04-02 12:22:35

+0

我很抱歉模糊不清。但主要的問題是,phistate 2d陣列給予NaN。代碼的核心有點複雜。我試圖縮短它。我也必須使用fftw3。但是,我不能用-lfftw3l進行編譯。這可能是問題嗎? – 2015-04-02 12:27:40

回答

2

嗯,是的,long double類型的文本值需要有一個L後綴。因此,使用2.0L而非2.02.0f(的float型)(類型double的)。

然而,從錯誤信息,你要求所有的變量都long double是假的。

至少有一個變量是std::complex<long double>型和錯誤消息表明涉及您的變量中的一個或多個操作不存在。

這意味着你不理解代碼的作用。也就是說,將double類型的所有內容更改爲long double以及修改文字值的類型,將會使其正常工作的更多。

由於您未提供足夠的信息,因此無法提供更具體的建議。特別是,您需要提供一個小而完整的代碼示例來說明您的問題。

+0

我的不好。我正在使用雙重和複雜的。他們現在都是長雙重複雜的。 – 2015-04-02 13:05:10