2014-05-14 3 views
0

내 코드에 이상한 문제가 있습니다. 여기에 컨텍스트가 있습니다 : 내 메서드에서 나는 객체를 만든 다음이 객체의 (int) 버퍼에 두 개의 "for 루프"의 데이터를 채 웁니다.for 루프에서 결과를 변경하는 이상한 동작

문제는 내 루프에 printf를 삽입하여 버퍼에있는 데이터를 보면 버퍼의 데이터가 변경된다는 것입니다. 상기 루프 내부의 printf 여부

을 Heres의 내 코드가 있다면 실제로, 버퍼의 결과는 어쩌면 이해하는 데 도움이 될 수 있습니다, 다른 :

bool Mod::Realiser(FFTResult * inputdata,FFTSample_s * & moduleData){ 
bool done = true; 
float module; 
unsigned int r,n; 
moduleData = new FFTSample_s(NbPointsSample); 
    unsigned int limit = NbPointsSample >> 1; 
int iGain= 0; 

    for (n = CentrageFFT, r = 0; r < limit; n++, r++) 
    { 

    module = inputdata->buffer[n][0] * inputdata->buffer[n][0] + inputdata->buffer[n][1] * inputdata->buffer[n][1]; 
    // printf(" M = %lf\n",module); 
    moduleData->buffer[r] = (int)(10.0*log10(module)) + iGain; 

    } 


    for (n = 0; n < limit; n++, r++) 
    { 

    module = inputdata->buffer[n][0] * inputdata->buffer[n][0] + inputdata->buffer[n][1] * inputdata->buffer[n][1]; 
    moduleData->buffer[r] = (int)(10.0*log10(module)) + iGain; 


    } 
/* for (int i=0;i<2048;i++){ 
     printf(" X = %lf \n",inputdata->buffer[i][0]); 
     printf(" Y = %lf \n",inputdata->buffer[i][1]); 
     printf(" M = %d\n",moduleData->buffer[i]); 
    }*/ 
+0

일종의 오버플로 문제 인 것 같습니다. – keyser

+3

당신은 ['printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf)의''% lf "'포맷이 무엇을 의미하는지 알고 있습니까? 즉,'double'을 출력하려고하지만'float'을 제공합니다. 왜 출력을 위해 타입 안전'std :: cout'을 사용하지 않습니까? –

+0

valgrind를 사용해보세요. 관련된 유형의 대부분과 그 내용을 알지 못하면 (예 :이 버퍼 변수가 무엇을 말하는지조차 알지 못함) 어떻게 생존했는지, 우리는 추측 할 수밖에 없습니다. – PlasmaHH

답변

0

이 정상 동작입니다. What Every Computer Scientist Should Know about Floating-Point Arithmetic을 참조하십시오. 부동 소수점 숫자를 printf으로 전달하면 구현시 더 높은 정밀도가 발생하는 내부 양식의 정규 float 형식으로 변환하도록 구현할 수 있습니다.

결과가 다를 수 있습니다. 유일하고 올바른 대답은 하나도 없습니다. 또한

은 :

"A + B의 결과는 지정되지 않은 정밀도의 임시 목적지에 저장되어 어느 중간 계산을 수행하고이 중간 정밀도에 영향을 줄 것을 정밀도 C++ 또는 IEEE 표준에 위임하여. 임시 결과는 부동 소수점 또는 이중에 똑같이 쉽게 저장할 수 있으며 두 옵션 모두에 상당한 이점이 있습니다. "- Floating-Point Determinism

관련 문제