改变结果的for循环中的奇怪行为

时间:2014-05-14 09:50:55

标签: c++

我的代码中遇到了一个奇怪的问题。 这里是上下文:在我的方法中,我创建了一个对象然后用两个数据填充该对象的(int)缓冲区" 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]);
  }*/

1 个答案:

答案 0 :(得分:0)

这是正常行为。见What Every Computer Scientist Should Know about Floating-Point Arithmetic。通过将浮点数传递给printf,您可能会强制实现将其从具有更高精度的内部形式转换为规范float形式。

结果可能不同。没有一个也只有一个正确答案。

此外:

  

“a + b的结果存储在一个未指定精度的临时目标中.C ++或IEEE标准都没有强制要求进行精确的中间计算,这个中间精度会影响你的结果。临时结果同样很容易。存储在浮点数或双精度数中,这两个选项都有明显的优势。“ - Floating-Point Determinism