我(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
上,我失去了长双精度任何想法?