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