我(http://www.fftw.org/doc/Precision.html)編制的FFTW 3.3.5庫:FFTW和長雙精度
./configure --enable-long-double
make
make install
我編譯下面gcc -std=gnu99 main.c -o sample.x -lfftw3l -lm
#include <math.h>
#include <complex.h>
#include <fftw3.h>
#include <string.h>
#define PI acosl(-1.0L)
#define FMODE FFTW_MEASURE
int main() {
fftwl_complex *A = fftwl_malloc(4096*sizeof(fftwl_complex));
fftwl_plan ft = fftwl_plan_dft_1d(4096, A, A, FFTW_BACKWARD, FMODE);
long double q, u, overN = ((long double) 1.L/4096);
for (long int j = 0; j < 4096; j++) {
q = 2.L*PI*(j*overN - 0.5L);
u = 2.L*atan2l(0.5L*sinl(0.5L*q),cosl(0.5L*q));
A[j] = -1.IL*cpowl(0.01L*(1.L/ctanl(0.5L*(u-0.1IL)) - 1.IL),2);
}
printf("%26.18LE\t%26.18LE\n", creall(A[1]), cimagl(A[1]));
fftwl_execute(ft);
for (int j = 0; j < 2048; j++) {
A[j] = -1.0IL*((fftwl_complex) j*A[j])*overN;
}
printf("%26.18LE\t%26.18LE\n", creall(A[1]), cimagl(A[1]));
memset(A+2048, 0, 2048*sizeof(fftwl_complex));
fftwl_execute(ft);
printf("%26.18LE\t%26.18LE\n", creall(A[1]), cimagl(A[1]));
}
代碼我的理解最終的結果printf必須是 相同的高達17-18十進制數字的所有運行,但 我得到的是在14位小數不同。 像這樣的東西可能表示長雙 被降爲雙類型。從一個運行代碼 切換到另一個輸出:
2.907416794556517046E-07 9.025765251354815022E-05
-5.697284273172913999E-04 7.463682637972633967E-24
1.895341327532694420E-04 3.343168537700265992E-07
2.907416794556517046E-07 9.025765251354815022E-05
-5.697284273172913999E-04 1.965167197605865111E-23
1.895341327532697672E-04 3.343168537692799396E-07
上,我失去了長雙精度任何想法?