2013-04-26 129 views
0

我正在執行過濾器代碼。此代碼在Visual Studio和代碼塊中給出了不同的結果。預期結果是代碼塊給出的結果。但由於我必須實施英特爾線程構建模塊,我必須使用Visual Studio.Please幫助找到差異的原因。在Visual Studio 2010和代碼塊中給出不同結果的相同代碼10.05

Code is : 


#include <stdio.h> 
#include <stdint.h> 
#include <cstring> 
#include <iostream> 
#include <fstream> 
#include <math.h> 
#include <time.h> 
using namespace std; 

#define pi 3.141593 
#define FILTER_LEN 265 

double coeffs[ FILTER_LEN ] = 
{ 
    0.0033473431384214393,0.000032074683390218124,0.0033131082058404943,0.0024777666109278788, 
    -0.0008968429179843104,-0.0031973449396977684,-0.003430943381749411,-0.0029796565504781646, 
    -0.002770673157048994,-0.0022783059845596586,-0.0008531818129514857,0.001115432556294998, 
    0.0026079871108133294,0.003012423848769931,0.002461420635709332,0.0014154004589753215, 
    0.00025190669718400967,-0.0007608257014963959,-0.0013703600874774068,-0.0014133823230551277, 
    -0.0009759556503342884,-0.00039687498737139273,-0.00007527524701314324,-0.00024181463305012626, 
    -0.0008521761947454302,-0.00162618205097997,-0.002170446498273018,-0.002129903305507943, 
    -0.001333859049002249,0.00010700092934983156,0.0018039564602637683,0.7930896349583, 
    0.0038325849735515363,0.003416201274366522,0.9,0.00017954815260431595, 
    -0.0016358832300944531,-0.0028402136847527387,-0.0031256650498727384,-0.0025374271571154713, 
    -0.001438370315670195,-0.00035115295209013755,0.0002606730012030533,0.0001969569787142967, 
    -0.00039635535951198597,-0.0010886127490608972,-0.0013530057243606405,-0.0008123200399262436, 
    0.0005730271959526784,0.0024419465938120906,0.004133717273258681,0.0049402122577746265, 
    0.0043879285604252714,0.002449549610687005,-0.00040283102645093463,-0.003337730734820209, 
    -0.0054508346511294775,-0.006093057767824609,-0.005117609782189977,-0.0029293645861970417, 
    -0.0003251033117661085,0.0018074390555649442,0.0028351284091668164,0.002623563404428517, 
    0.0015692864792199496,0.0004127664681096788,-0.00009249878881824428,0.0004690173244168184, 
    0.001964334172374759,0.0037256715492873485,0.004809640399145206,0.004395274594482053, 
    0.0021650921193604,-0.0014888595443799124,-0.005534807968511709,-0.008642334104607624, 
    -0.009668950651149259,-0.008104732391434574,-0.004299972815463919,0.0006184612821881392, 
    0.005136551428636121,0.007907786753766152,0.008241212326068366,0.00634786595941524, 
    0.003235610213062744,0.00028882736660937287,-0.001320994685952108,-0.0011237433853145615, 
    0.00044213409507615003,0.0022057106517524255,0.00277593527678719,0.0011909915058737617, 
    -0.0025807757230413447,-0.007497632882437637,-0.011739520895818884,-0.013377018279057393, 
    -0.011166543231844196,-0.005133056165990026,0.0032948631959114935,0.011673660427968408, 
    0.017376415708412904,0.018548938130314566,0.014811760899506572,0.007450782505155853, 
    -0.001019540069785369,-0.007805775815783898,-0.010898333714715424,-0.00985364043415772, 
    -0.005988406030111452,-0.001818560524968024,0.000028552677472614846,-0.0019938756495376363, 
    -0.007477684025727061,-0.013989430449615033,-0.017870518868849213,-0.015639422062597726, 
    -0.005624959109456065,0.010993528170353541,0.03001263681283932,0.04527492462846608, 
    0.050581340787164114,0.041949186532860346,0.019360612460662185,-0.012644336735920483, 
    -0.0458782599058412,-0.07073838953156347,-0.0791205623455818,-0.06709535677423759, 
    -0.03644544574795176,0.005505370370858695,0.04780486657828151,0.07898800597378192, 
    0.0904453420042807,0.07898800597378192,0.04780486657828151,0.005505370370858695, 
    -0.03644544574795176,-0.06709535677423759,-0.0791205623455818,-0.07073838953156347, 
    -0.0458782599058412,-0.012644336735920483,0.019360612460662185,0.041949186532860346, 
    0.050581340787164114,0.04527492462846608,0.03001263681283932,0.010993528170353541, 
    -0.005624959109456065,-0.015639422062597726,-0.017870518868849213,-0.013989430449615033, 
    -0.007477684025727061,-0.0019938756495376363,0.000028552677472614846,-0.001818560524968024, 
    -0.005988406030111452,-0.00985364043415772,-0.010898333714715424,-0.007805775815783898, 
    -0.001019540069785369,0.007450782505155853,0.014811760899506572,0.018548938130314566, 
    0.017376415708412904,0.011673660427968408,0.0032948631959114935,-0.005133056165990026, 
    -0.011166543231844196,-0.013377018279057393,-0.011739520895818884,-0.007497632882437637, 
    -0.0025807757230413447,0.0011909915058737617,0.00277593527678719,0.0022057106517524255, 
    0.00044213409507615003,-0.0011237433853145615,-0.001320994685952108,0.00028882736660937287, 
    0.003235610213062744,0.00634786595941524,0.008241212326068366,0.007907786753766152, 
    0.005136551428636121,0.0006184612821881392,-0.004299972815463919,-0.008104732391434574, 
    -0.009668950651149259,-0.008642334104607624,-0.005534807968511709,-0.0014888595443799124, 
    0.0021650921193604,0.004395274594482053,0.004809640399145206,0.0037256715492873485, 
    0.001964334172374759,0.0004690173244168184,-0.00009249878881824428,0.0004127664681096788, 
    0.0015692864792199496,0.002623563404428517,0.0028351284091668164,0.0018074390555649442, 
    -0.0003251033117661085,-0.0029293645861970417,-0.005117609782189977,-0.006093057767824609, 
    -0.0054508346511294775,-0.003337730734820209,-0.00040283102645093463,0.002449549610687005, 
    0.0043879285604252714,0.0049402122577746265,0.004133717273258681,0.0024419465938120906, 
    0.0005730271959526784,-0.0008123200399262436,-0.0013530057243606405,-0.0010886127490608972, 
    -0.00039635535951198597,0.0001969569787142967,0.0002606730012030533,-0.00035115295209013755, 
    -0.001438370315670195,-0.0025374271571154713,-0.0031256650498727384,-0.0028402136847527387, 
    -0.0016358832300944531,0.00017954815260431595,0.9,0.003416201274366522, 
    0.0038325849735515363,0.7930896349583,0.0018039564602637683,0.00010700092934983156, 
    -0.001333859049002249,-0.002129903305507943,-0.002170446498273018,-0.00162618205097997, 
    -0.0008521761947454302,-0.00024181463305012626,-0.00007527524701314324,-0.00039687498737139273, 
    -0.0009759556503342884,-0.0014133823230551277,-0.0013703600874774068,-0.0007608257014963959, 
    0.00025190669718400967,0.0014154004589753215,0.002461420635709332,0.003012423848769931, 
    0.0026079871108133294,0.001115432556294998,-0.0008531818129514857,-0.0022783059845596586, 
    -0.002770673157048994,-0.0029796565504781646,-0.003430943381749411,-0.0031973449396977684, 
    -0.0008968429179843104,0.0024777666109278788,0.0033131082058404943,0.000032074683390218124, 
    0.0033473431384214393 
}; 

void ComputeFIR(double *coeffs, double *input, int filterLength,ofstream &o) 
{ 
    double acc; 
    double *coeffp; 
    int n,k,ip,nip; 
    o<<fixed; 
    for (n = 0; n < 150000; n++) 
    { 
     coeffp = coeffs; 
     ip=(filterLength - 1 + n); 
     nip=0; 

     acc = 0; 
     for (k = 0; k < filterLength; k++) 
     { 
      nip=ip-k; 
      acc += ((*coeffp++) * (input[nip]));     //  *inputp-- we can't use bcoz dynamic memory is not neccasarily in sequence); 
     } 
     o<<n<<","<<acc<<endl; 
     if(n<10) 
     { 
      cout<<n<<"\t"<<acc<<endl; 
     } 
    } 
} 


int main() 
{ 
    int i; 

    ofstream o("400hz.csv"); 
    cout<<fixed; 
    o<<fixed; 
    double *buffer=new double[150264];        //  Length required to process M input samples is N-1+M where N is MAC , M is the Number of samples 

    memset(buffer, 0, sizeof(buffer)); 

    for(i =(FILTER_LEN - 1); i < 150264; i++) 
    { 
      buffer[i] = sin(400 * (2 * pi) * (i/5000.0)); 
      o<<i<<","<<buffer[i]<<endl; 
    } 

    ComputeFIR(coeffs,buffer,FILTER_LEN,o); 

    delete []buffer; 
    return 0; 
} 

在該代碼部分

if(n<10) 
      { 
       cout<<n<<"\t"<<acc<<endl; 
      } 

給出的代碼塊的結果

0 0.002291

1 0.003205

2 0.005587

3 0.007458

4 0.006254

5 0.001537

6 -0.005113

7 -0.011685

8 -0.0016522

9 -0.018142

其是如預期

和在Visual Studio中的結果是

0 7.86052E + 64

1 7.88065E + 64

2 9.96043E + 64

3 1.15158E + 65

4 1.09528E + 65

5 8.94574E + 64

6 6.79198E + 64

7 4.92152E + 64

8 3.18225E + 64

9 1.75206E + 64

請幫助解決這個問題。

回答

5

以下行不初始化您的緩衝區爲零:

memset(buffer, 0, sizeof(buffer)); 

你需要

memset(buffer, 0, sizeof(double) * 150264); 

也許代碼塊和VS2012的,因爲它們初始化該緩衝區的方式不同。

2

當使用不同的編譯器時,具有相同的代碼會產生不同的結果,這肯定是未定義行爲的標誌。

這背後不確定的行爲的原因是因爲這一點:

memset(buffer, 0, sizeof(buffer)); 

的第一個問題是變量buffer是一個指針,因此使用sizeof(buffer)你得到的實際指針的大小,而不是什麼指着。這意味着只有四個或八個字節(取決於您是否擁有32位或64位平臺)將被初始化爲零。其餘的內存將看似隨機。

第二個問題在這種情況下起作用(但在這種情況下),就是您將所有數據都設置爲零。浮點數不會像內存中的正常整數一樣存儲。你不能使用任何其他值memset,並期望數字是你想要的。

+0

「你不能使用...」一般來說,是的。但使用IEEE浮點(即,幾乎所有現實世界的實現)將這些位設置爲0確實會創建一個值0.0。 – 2013-04-26 13:51:51

相關問題