爲了提高精度,我一直在試圖將程序從雙倍升級到長倍。但是,我得到了以下錯誤。在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給出的所有值。
提供一個可重現問題的最小的,可編譯的代碼? – coyotte508 2015-04-02 12:17:45
你能比「無法正常工作」更具體嗎? – molbdnilo 2015-04-02 12:22:35
我很抱歉模糊不清。但主要的問題是,phistate 2d陣列給予NaN。代碼的核心有點複雜。我試圖縮短它。我也必須使用fftw3。但是,我不能用-lfftw3l進行編譯。這可能是問題嗎? – 2015-04-02 12:27:40