为什么这个无意义的代码行是使这个函数工作的唯一因素?

时间:2016-05-22 21:38:57

标签: c++

我正在学习C ++并决定制作一堆小而短的练习功能。下面这段代码会给我一个错误的答案:

float pairwiseSum(float data[], int arraySize, int naive_sum_size=8) {
  if (arraySize <= naive_sum_size) {
    return naiveSum(data, arraySize);
  } else {
    int m = arraySize / 2;
    return pairwiseSum(&data[0], m) + pairwiseSum(&data[m], arraySize-m);
  }
}

naiveSum在这种情况下只是遍历一个数组累积总和,似乎工作正常。如果我有64个1的数组,它会告诉我总和是288。

但是,这个版本的代码每次都能完美运行:

float pairwiseSum(float data[], int arraySize, int naive_sum_size=8) {
  if (arraySize <= naive_sum_size) {
    cout << "";
    return naiveSum(data, arraySize);
  } else {
    int m = arraySize / 2;
    return pairwiseSum(&data[0], m) + pairwiseSum(&data[m], arraySize-m);
  }
}

我使用Fedora 21并使用g ++ 4.9.2进行编译

为什么一个功能有效,另一个功能失败?

编辑:我的main.cpp文件中显示的完整程序如下所示。

#include <iostream>
#include <stdlib.h>

using namespace std;


float naiveSum(float data[], int arraySize) {
  float sum;
  for (int i = 0; i < arraySize; i++)
    sum += data[i];
  return sum;
}


// Divide-and-conquer algorithm is a little faster than the
// Kahan Summation Algorithm, but also less accurate.
float pairwiseSum(float data[], int arraySize, int naive_sum_size=8) {
  if (arraySize <= naive_sum_size) {
    //cout << "";
    return naiveSum(data, arraySize);
  } else {
    int m = arraySize / 2;
    return pairwiseSum(&data[0], m) + pairwiseSum(&data[m], arraySize-m);
  }
}


int main() {
  const int SIZE = 64;
  const int rndRange = 100;

  // generate random array
  srand(time(NULL));
  float xs[SIZE];
  for (int i=0; i<SIZE; i++)
    // +1 prevents division by zero
    //xs[i] = rand() % rndRange / (float)(rand() % rndRange + 1);
    xs[i] = 1;

  // Print kahan sum of random array
  //cout << "Kahan Sum: " << kahanSum(xs, SIZE) << endl << endl;
  cout << endl << pairwiseSum(xs, SIZE) << endl;

  return 1;
}

编辑:是的,这确实是一个问题,总和没有初始化。谢谢你的帮助。

1 个答案:

答案 0 :(得分:6)

sum未在naiveSum中初始化。剩下的就是未定义的行为(由sum中的不确定值引起),无论是否存在无关的cout << ""行,都表现出不同的行为。

cout << ""有许多不同的方式可以导致sum的不确定初始值最终为零,从而使naiveSum的外观正常工作。