Ho una funzione che genera alcuni numeri grandi, li inserisce in un vettore, li somma, restituisce la somma. Ho usato std::accumulate
per calcolare la somma, tuttavia, dopo alcuni test, mi sono reso conto che non stava restituendo la somma prevista.Possibile overflow con std :: accumulate
typedef unsigned long long ull;
ull sum(ull kLimit)
{
ull testSum = 0;
vector<ull> numbers;
for (ull n = 0; n < kLimit; ++n) {
if (/* number I want */) {
numbers.push_back(n);
// directly sum for testing
testSum += n;
}
}
ull sum = accumulate(begin(numbers), end(numbers), 0);
return sum;
}
mi aspetterei il valore di sum
e testSum
essere uguali. Tuttavia, la somma è uguale a 470064632
e la somma di prova è uguale a 82074443256
, che è il valore previsto.
Ho provato a ridurre il limite a un numero molto più piccolo (500) ei valori di sum
e testSum
erano uguali. Questo mi fa pensare che l'errore sia overflow con accumulate
, non sono sicuro di quale potrebbe essere il problema. Sto compilando con VS2012 per una piattaforma x64.
Che cosa è che 'numero che ho want' parte lì dentro? – didierc