https://www.cnblogs.com/warmbeast/p/7809286.html
发现关于fftw这个库的使用者很少啊,特别是这个库在c99与c11下的使用竟有不同之处。比如C11对fftwf_complex数据取实部虚部直接[0]、[1]就可以,C99中却不行要按下面做?
printf("w:(%f,%f) !!!\n",crealf(w[i]),cimagf(w[i]));
比如C99下两个fftwf_complex相乘直接用*就行,C11中却不行,如果改用C11中对复数的乘法算出来也与C99下直接*的结果有差别,小数点后的结果不一致?!如下所示:
//C11下写的对fftwf_complex两个数的乘法,但下面两种写法都与C99下z[i]*x[i]的略不一致,即小数点后不一致
void pointwise_complex_multiplication(fftwf_complex *z,fftwf_complex *x,int n,fftwf_complex *w)
{
for(int i=0;i<n;i++)
{
//dismatch c11
w[i][0]=z[i][0]*x[i][0]-z[i][1]*x[i][1];
w[i][1]=z[i][0]*x[i][1]+z[i][1]*x[i][0];
//dismatch c11
//w[i][0]=z[i][0]*(x[i][0]+x[i][1]);
//w[i][1]=z[i][1]*(x[i][0]+x[i][1]);
}
}
然后C99下:
//C99下的正确写法,直接用操作符*就可以了
//在这句之前输出z[i]、x[i]的实部、虚部与C11下的一致,哪怕小数点后5位也一致
w[i] = z[i] * x[i];
//但在这句之后输出w[i]的实部、虚部就与C11下略有不同了,小数点后不一致。
通过调试可以看到:左边是C99的结果,右边是C11的结果,可以看到小数点后的数据没对上:
贴出来:
c99 fftwf_complex operator * result:
(30967.490234,0.000000)
(-1950.387451,-166.434525)
(-1158.038940,756.193054)
(-1334.538818,-1130.796631)
(-819.429626,39.296997)
(-91.523949,809.191223)
(13.948779,-110.528328)
(-164.385590,-66.933281)
(-160.344788,-117.937607)
(-0.095748,144.198303)
(-376.043976,-250.734467)
(21.665018,-106.575714)
(144.692795,196.289780)
(-99.489304,-80.197296)
(28.306635,37.939674)
(-19.775280,145.093063)
(51.476357,19.221403)
(45.006618,-76.846252)
(-27.557671,-13.154622)
(12.989132,52.029812)
(29.180330,-8.284921)
(13.214874,-14.672416)
(-3.598421,56.043770)
(-24.226379,12.638783)
(2.625340,36.174389)
(13.441189,-18.405294)
(-4.093601,-4.841472)
(29.325947,-0.767191)
(4.521169,11.830598)
(-8.554667,6.131295)
(-2.915850,-15.778939)
(-6.854457,-3.191259)
C11下:
c11 fftwf_complex multiply:
(30967.492188,0.000000) !!!
(-1950.387451,166.434509) !!!
(-1158.038940,-756.193115) !!!
(-1334.539062,1130.796387) !!!
(-819.429626,-39.296921) !!!
(-91.524086,-809.191162) !!!
(13.948624,110.528366) !!!
(-164.385712,66.933235) !!!
(-160.344864,117.937614) !!!
(-0.095818,-144.198318) !!!
(-376.044067,250.734482) !!!
(21.664967,106.575706) !!!
(144.692764,-196.289764) !!!
(-99.489372,80.197304) !!!
(28.306610,-37.939674) !!!
(-19.775333,-145.093018) !!!
(51.476337,-19.221386) !!!
(45.006584,76.846252) !!!
(-27.557659,13.154646) !!!
(12.989131,-52.029797) !!!
(29.180319,8.284931) !!!
(13.214869,14.672392) !!!
(-3.598404,-56.043751) !!!
(-24.226360,-12.638774) !!!
(2.625357,-36.174358) !!!
(13.441205,18.405296) !!!
(-4.093592,4.841476) !!!
(29.325951,0.767207) !!!
(4.521188,-11.830579) !!!
(-8.554657,-6.131292) !!!
(-2.915827,15.778945) !!!
(-6.854446,3.191261) !!!
为什么会有这个差别?!如果直接C11下用*操作符,则是不支持的,会报下面的错误:
‘fftwf_complex’ {aka ‘float [2]’}和‘fftwf_complex’ {aka ‘float [2]’}对双目‘operator*’而言无效
大家有遇到这个问题吗?