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

Чтобы повысить точность, я пытался обновить программу с двойного до длинного двойного. Однако я получил следующую ошибку.

haread.cpp:178:43: ошибка: нет совпадения для 'operator*' в '2.0e+0 * std::operator+ [с _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] ;

Массивы были динамически определены с использованием «нового». Все переменные имеют тип 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.


person Population Xplosive    schedule 02.04.2015    source источник
comment
Предоставить минимальный компилируемый код, воспроизводящий проблему?   -  person coyotte508    schedule 02.04.2015
comment
Не могли бы вы уточнить, что не работает должным образом?   -  person molbdnilo    schedule 02.04.2015
comment
Прошу прощения за расплывчатость. Но главная проблема в том, что массив phistate 2d дает NaN. Ядро кода немного сложно. Я пытаюсь сократить его. Я также должен использовать fftw3. Однако я не могу скомпилировать с -lfftw3l. Может ли это быть проблема?   -  person Population Xplosive    schedule 02.04.2015
comment
long double и double могут иметь одинаковую точность. Я бы сначала проверил, что они разные в вашем компиляторе.   -  person Neil Kirk    schedule 02.04.2015
comment
Отлаживайте свой код самостоятельно. Вы можете отслеживать, где впервые появляются NaN или Inf (при необходимости используйте распечатки или утверждения).   -  person Walter    schedule 02.04.2015


Ответы (1)


Ну да, буквальное значение типа long double должно иметь постфикс L. Поэтому используйте 2.0L, а не 2.0 (типа double) или 2.0f (типа float).

Однако из сообщения об ошибке ваше утверждение о том, что все переменные равны long double, неверно.

По крайней мере одна из переменных имеет тип std::complex<long double>, и сообщение об ошибке указывает на то, что операция, включающая одну или несколько ваших переменных, не существует.

Это означает, что вы не понимаете, что делает код. Это означает, что для правильной работы будет больше, чем изменение всех вещей типа double на long double и исправление типа литеральных значений.

Более конкретную консультацию дать невозможно, так как вы предоставили недостаточно информации. В частности, вам нужно будет предоставить небольшой и полный образец кода, который иллюстрирует вашу проблему (проблемы).

person Peter    schedule 02.04.2015
comment
Виноват. Я использовал двойной и сложный‹двойной›. Все они теперь длинные двойные и сложные‹длинные двойные›. - person Population Xplosive; 02.04.2015