Чтобы повысить точность, я пытался обновить программу с двойного до длинного двойного. Однако я получил следующую ошибку.
haread.cpp:178:43: ошибка: нет совпадения для 'operator*' в '2.0e+0 * std::operator+ [с _Tp = long double](((((const std::complex em>)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] ;
Массивы были динамически определены с использованием «нового». Все переменные имеют тип long double. Задача получена для всех случаев, когда комплексный массив умножается на какое-то число. Итак, я поменял 2.0 на 2.0L и все подобные случаи. Итак, теперь сборка прошла успешно. Однако моя программа больше не работает должным образом. Нужно ли мне добавлять суффикс L ко всем длинным двойникам, которые я определил? Я определил их следующим образом:
длинный двойной хмин = 1,6; длинный двойной 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 — длинные двойные коэффициенты, значения которых хорошо определены. Все переменные, определение которых не показано, имеют тип long double.
Когда я использую только двойное число вместо длинного двойного, у меня нет проблем с получением результатов. При использовании long double phistate_new, мой результат, имеет все значения, заданные NaN.
long double
иdouble
могут иметь одинаковую точность. Я бы сначала проверил, что они разные в вашем компиляторе. - person Neil Kirk   schedule 02.04.2015