ich die FFTW 3.3.5 Bibliotheken mit (http://www.fftw.org/doc/Precision.html) zusammengestellt:FFTW und doppelter Präzision
./configure --enable-long-double
make
make install
ich kompilieren Sie den Code unten mit 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]));
}
Um meine das Ergebnis der endgültigen Verständnis printf muss die gleichen bis zu 17-18 Dezimalziffern für alle Läufe sein, aber was ich bekomme ist in der 14. Dezimalstelle deutlich. So etwas könnte bedeuten, dass ein langer doppelter zu einem doppelten Typ degradiert wurde. Die Ausgabe der Code ändert sich von einem Lauf zum anderen:
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
Irgendwelche Ideen auf, wo ich verloren die lange Doppel Genauigkeit?