首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++模板:使用MInGW获得错误的结果(输出)

C++模板:使用MInGW获得错误的结果(输出)
EN

Stack Overflow用户
提问于 2013-02-11 05:12:36
回答 2查看 236关注 0票数 0

我不愿问这个问题,因为我的C++模板程序可能有问题,但这个问题在过去几个小时里一直困扰着我。我在Visual C++和Mingw-g++编译器上运行了完全相同的程序,但只有VC2010给出了预期的结果。我无论如何都不是熟练的C++程序员,所以从两个编译器中都得不到任何错误消息甚至更令人沮丧。

编辑:在解决错误失败后,我做了mingw-get升级。我运行的是g++ 4.5.2,现在我的版本是4.7.2,但问题仍然存在。

后期更新-我完全卸载了MinGW platform,手动删除了每个文件夹,然后安装了MinGW-GCC,但问题仍然存在。可能与我的Windows安装有冲突。我已经暂时安装了Cygwin和g++ 4.5.3 (它正在工作),因为现在还不能重新安装操作系统。谢谢你的帮助。

这是我的代码。(头文件itertest.h)

代码语言:javascript
复制
#ifndef ITERTEST_H
#define ITERTEST_H

#include <iostream>
#include <cmath>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

template <typename T>
class fft_data{
public: 
vector<T> re;
vector<T> im;

};

template <typename T>
void inline twiddle(fft_data<T> &vec,int N,int radix){
// Calculates twiddle factors for radix-2
T PI2 = (T) 6.28318530717958647692528676655900577;
T theta = (T) PI2/N;
vec.re.resize(N/radix,(T) 0.0);
vec.im.resize(N/radix,(T) 0.0);
vec.re[0] = (T) 1.0;

for (int K = 1; K < N/radix; K++) {
    vec.re[K] = (T) cos(theta * K);
    vec.im[K] = (T) sin(theta * K);
}


}

template <typename T>
void inline sh_radix5_dif(fft_data<T> &x,fft_data<T> &wl, int q, int sgn) {
int n = x.re.size();
int L = (int) pow(5.0, (double)q);
int Ls = L / 5;
int r = n / L;

T c1 = 0.30901699437;
T c2 = -0.80901699437;
T s1 = 0.95105651629;
T s2 = 0.58778525229;

T tau0r,tau0i,tau1r,tau1i,tau2r,tau2i,tau3r,tau3i;
T tau4r,tau4i,tau5r,tau5i;
T br,bi,cr,ci,dr,di,er,ei;

fft_data<T> y = x;
T wlr,wli,wl2r,wl2i,wl3r,wl3i,wl4r,wl4i;
int lsr = Ls*r;

for (int j = 0; j < Ls; j++) {
    int ind = j*r;
    wlr = wl.re[ind];
    wli = wl.im[ind];

    wl2r = wlr*wlr - wli*wli;
    wl2i = 2.0*wlr*wli;

    wl3r = wl2r*wlr - wli*wl2i;
    wl3i= wl2r*wli + wl2i*wlr;

    wl4r = wl2r*wl2r - wl2i*wl2i;
    wl4i = 2.0*wl2r*wl2i;

    for (int k =0; k < r; k++) {
        int index = k*L+j;
        int index1 = index+Ls;
        int index2 = index1+Ls;
        int index3 = index2+Ls;
        int index4 = index3+Ls;

        tau0r = y.re[index1] + y.re[index4];
        tau0i = y.im[index1] + y.im[index4];

        tau1r = y.re[index2] + y.re[index3];
        tau1i = y.im[index2] + y.im[index3];

        tau2r = y.re[index1] - y.re[index4];
        tau2i = y.im[index1] - y.im[index4];

        tau3r = y.re[index2] - y.re[index3];
        tau3i = y.im[index2] - y.im[index3];

        tau4r = c1 * tau0r + c2 * tau1r;
        tau4i = c1 * tau0i + c2 * tau1i;

        tau5r = sgn * ( s1 * tau2r + s2 * tau3r);
        tau5i = sgn * ( s1 * tau2i + s2 * tau3i);

        br = y.re[index] + tau4r + tau5i;
        bi = y.im[index] + tau4i - tau5r;

        er = y.re[index] + tau4r - tau5i;
        ei = y.im[index] + tau4i + tau5r;

        tau4r = c2 * tau0r + c1 * tau1r;
        tau4i = c2 * tau0i + c1 * tau1i;

        tau5r = sgn * ( s2 * tau2r - s1 * tau3r);
        tau5i = sgn * ( s2 * tau2i - s1 * tau3i);

        cr = y.re[index] + tau4r + tau5i;
        ci = y.im[index] + tau4i - tau5r;

        dr = y.re[index] + tau4r - tau5i;
        di = y.im[index] + tau4i + tau5r;

        int indexo = k*Ls+j;
        int indexo1 = indexo+lsr;
        int indexo2 = indexo1+lsr;
        int indexo3 = indexo2+lsr;
        int indexo4 = indexo3+lsr;

        x.re[indexo]= y.re[index] + tau0r + tau1r;
        x.im[indexo]= y.im[index] + tau0i + tau1i;

        x.re[indexo1] = wlr*br - wli*bi;
        x.im[indexo1] = wlr*bi + wli*br;

        x.re[indexo2] = wl2r*cr - wl2i*ci;
        x.im[indexo2] = wl2r*ci + wl2i*cr;

        x.re[indexo3] = wl3r*dr - wl3i*di;
        x.im[indexo3] = wl3r*di + wl3i*dr;

        x.re[indexo4] = wl4r*er - wl4i*ei;
        x.im[indexo4] = wl4r*ei + wl4i*er;


    }

}

}

template <typename T>
void inline fftsh_radix5_dif(fft_data<T> &data,int sgn, unsigned int N) {
//unsigned int len = data.re.size(); 

int num = (int) ceil(log10(static_cast<double>(N))/log10(5.0));

//indrev(data,index);
fft_data<T> twi;

twiddle(twi,N,5);
if (sgn == 1) {
    transform(twi.im.begin(), twi.im.end(),twi.im.begin(),bind1st(multiplies<T>(),(T) -1.0));
}

for (int i=num; i > 0; i--) {
sh_radix5_dif(data,twi,i,sgn);


}


}


#endif

main.cpp

代码语言:javascript
复制
#include "itertest.h"

using namespace std;



int main(int argc, char **argv)
{
int N = 25;
//vector<complex<double> > sig1;
fft_data<double> sig1;
for (int i =0; i < N; i++){
//sig1.push_back(complex<double>((double)1.0, 0.0));
    //sig2.re.push_back((double) i);
    //sig2.im.push_back((double) i+2);
    sig1.re.push_back((double) 1);
    sig1.im.push_back((double) 0);
}


fftsh_radix5_dif(sig1,1,N);



for (int i =0; i < N; i++){
    cout << sig1.re[i] << " " << sig1.im[i] << endl;
}

cin.get();

return 0;

}

预期的输出(我从VC2010得到的)

代码语言:javascript
复制
25 0
4.56267e-016 -2.50835e-016
2.27501e-016 -3.58484e-016
1.80101e-017 -2.86262e-016
... rest 21 rows same as the last three rows ( < 1e-015) 

Mingw-g++的输出

代码语言:javascript
复制
20 0
4.94068e-016 -2.10581e-016
2.65385e-016 -3.91346e-016
-5.76751e-017 -2.93654e-016
5 0
-1.54508 -4.75528
-3.23032e-017 1.85061e-017
-4.68253e-017 -1.18421e-016
-6.32003e-017 -2.05833e-016
1.11022e-016 0
4.04508 -2.93893
8.17138e-017 6.82799e-018
3.5246e-017 9.06767e-017
-6.59101e-017 -1.62762e-016
1.11022e-016 0
4.04508 2.93893
-6.28467e-017 6.40636e-017
1.79807e-016 3.34411e-017
-6.94919e-017 -1.05831e-016
1.11022e-016 0
-1.54508 4.75528
5.70402e-017 -1.68674e-017
-1.36169e-016 -8.30473e-017
-9.75639e-017 3.40359e-016
1.11022e-016 0
EN

回答 2

Stack Overflow用户

发布于 2013-02-11 05:36:11

您的MinGW安装一定有问题。你可能有一个过时的,有缺陷的版本的GCC。非官方的TDM-GCC发行版通常有一个更新的版本:http://tdm-gcc.tdragon.net/

当我在Ubuntu上用GCC 4.6.3编译你的代码时,它产生了下面的输出,这似乎与VC2010的输出完全匹配(但我无法验证这一点,因为你没有提供完整的输出)。添加选项-O3 -ffast-math -march=native似乎不会改变任何事情。

请注意,我必须修复fftsh_radix5_dif中的一个明显的拼写错误(在要乘的模板参数列表中缺少右尖括号),但我假设您的代码中没有这个错误,因为它根本不会编译。

代码语言:javascript
复制
25 0
4.56267e-16 -2.50835e-16
2.27501e-16 -3.58484e-16
1.80101e-17 -2.86262e-16
-5.76751e-17 -1.22566e-16
8.88178e-16 0
9.45774e-17 1.19479e-17
1.27413e-16 -5.04465e-17
7.97139e-17 -9.63575e-17
1.35142e-17 -7.08438e-17
8.88178e-16 0
4.84283e-17 4.54772e-17
1.02473e-16 2.63107e-17
1.02473e-16 -2.63107e-17
4.84283e-17 -4.54772e-17
8.88178e-16 0
1.35142e-17 7.08438e-17
7.97139e-17 9.63575e-17
1.27413e-16 5.04465e-17
9.45774e-17 -1.19479e-17
8.88178e-16 0
-5.76751e-17 1.22566e-16
1.80101e-17 2.86262e-16
2.27501e-16 3.58484e-16
4.56267e-16 2.50835e-16
票数 1
EN

Stack Overflow用户

发布于 2013-02-11 05:56:19

检查正在运行的可执行文件的创建日期。

您可能正在运行程序的早期草案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14802642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档