Чтобы повысить точность, я пытался обновить программу с двойной до длинной двойной. Однако я получил следующую ошибку.
haread.cpp: 178: 43: ошибка: нет совпадения с оператором * в 2.0e + 0 *
std :: operator + [с _Tp = long double] (((((const std :: complex) KEp) + ((длинное целое без знака) (((длинное целое без знака) i) *
32ул)))), ((const std :: complex) (& Энергия)
Линия была
phicheb [1] [i] = (2,0 * (KEp [i] + энергия) / dE) -фистат [is] [i];
Массивы были определены динамически с использованием ‘new’. Все переменные длинные двойные. Задача была получена для всех случаев, когда некоторое число умножает сложный массив. Итак, я поменял 2,0 на 2,0 л и все подобные случаи. Итак, теперь сборка прошла успешно. Однако моя программа больше не работает должным образом. Нужно ли добавлять суффикс L ко всем длинным двойникам, которые я определил? Я определил их следующим образом:
длинный двойной xmin = 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.
Когда я использую просто 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
и исправление типа литеральных значений.
Невозможно дать более конкретный совет, так как вы не предоставили достаточно информации. В частности, вам нужно будет предоставить небольшой и полный пример кода, который иллюстрирует ваши проблемы.