2012-12-16 15 views
10

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.

+1

Che cosa è che 'numero che ho want' parte lì dentro? – didierc

risposta

18

Sembra un errore di overflow: i numeri sono 0x131C049DF8 e 0x1C049DF8.

Prova a trasmettere il vostro parametro finale 0 digitare ull, perché il tipo restituito da Accumulate è il tipo di quel parametro finale:

T accumulate(InputIt first, InputIt last, T value) { ... } 
+1

Completamente corretto, lo ricorderò sicuramente per la prossima volta. Grazie mille. –

Problemi correlati