Изменение с double на long double в С++ больше не дает правильных результатовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Изменение с double на long double в С++ больше не дает правильных результатов

Сообщение Anonymous »

Чтобы повысить точность, я пытался обновить программу с 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. Проблема была получена для всех случаев, когда некоторое число умножает массив complex. Итак, я поменял 2.0 на 2.0л и все подобные случаи. Итак, теперь компиляция прошла успешно. Однако моя программа больше не работает должным образом. Нужно ли мне добавлять суффикс 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(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(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], которая является волновой функцией, соответствующей основному состоянию (все остальные состояния равны нулю). Затем я вычисляю энергию системы (кинетическая энергия с использованием преобразования Фурье и потенциальная энергия уже заданы). Теперь, используя особый метод (метод Чебычева), я распространяю волновую функцию во времени. Этот метод основан на рекурсивном отношении. В этой рекурсии распространение рассчитывается с использованием полиномиального разложения. Chebc — это длинные двойные коэффициенты, значения которых четко определены. Все переменные, определение которых не показано, имеют тип long double.
Когда я использую просто double вместо long double, у меня нет проблем с получением результатов. При использовании long double мой результат phistate_new имеет все значения, заданные NaN.

Подробнее здесь: https://stackoverflow.com/questions/294 ... ct-results
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»