我正在学习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;
}
编辑:是的,这确实是一个问题,总和没有初始化。谢谢你的帮助。
答案 0 :(得分:6)
sum
未在naiveSum
中初始化。剩下的就是未定义的行为(由sum
中的不确定值引起),无论是否存在无关的cout << ""
行,都表现出不同的行为。
cout << ""
有许多不同的方式可以导致sum
的不确定初始值最终为零,从而使naiveSum
的外观正常工作。