我用(http://www.fftw.org/doc/Precision.html)编译了FFTW 3.3.5库:

./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]));
}

据我所知,最终打印的结果必须是
但是,所有运行的小数位数都是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

你知道我在哪里失去了长时间的双精度吗?

最佳答案

由复FFT得到的阵列的每一项都是a weighted sum of the 4096 items of the input array的,可以用不同的方法计算对误差传播方式的研究可按here所述进行。
由于和的权重总是范数1,所以输出数组项的方差就是输入数组项的方差之和(输入数组项被视为独立随机变量)。
精度1e-18是标准偏差与标准值的比值因此,如果使用long double:
最后,结果的精度写入:
这个方程的一个直接结果是灾难性相消现象:输出的标准差是有限的,但由于相似值被减除,所以|y|值很小结果,没有一个数字是有意义的例如,请参见此处(https://en.wikipedia.org/wiki/Loss_of_significance)这就解释了为什么在您的案例中7.463682637972633967E-24很容易变成1.965167197605865111E-23实际上,如果发生部分消除,精度很容易从1e-18降低到1e-14这样的值较小的| y |值具有较低的有效数字。
不同运行之间的输出不同,这可能是由于使用了标志FFTW_MEASURE如果使用此标志,将尝试不同的算法,FFTW将选择最快的算法由于长度4096的1dfft现在非常快,因此时序可能不太一致,并且可以选择具有可比性能的不同算法不同的算法将导致不同的计算和不同的结果对非有效数字这些变化是否仍然存在,如果使用了标志“cc”?如果使用此标志,it seems that FFTW uses a simple heuristic to choose the algorithm很可能这种启发式是确定性的。。。

关于c - FFTW和长 double ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41077994/

10-11 04:25