我的代码中遇到了一个奇怪的问题。 这里是上下文:在我的方法中,我创建了一个对象然后用两个数据填充该对象的(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]);
}*/
答案 0 :(得分:0)
这是正常行为。见What Every Computer Scientist Should Know about Floating-Point Arithmetic。通过将浮点数传递给printf
,您可能会强制实现将其从具有更高精度的内部形式转换为规范float
形式。
结果可能不同。没有一个也只有一个正确答案。
此外:
“a + b的结果存储在一个未指定精度的临时目标中.C ++或IEEE标准都没有强制要求进行精确的中间计算,这个中间精度会影响你的结果。临时结果同样很容易。存储在浮点数或双精度数中,这两个选项都有明显的优势。“ - Floating-Point Determinism