Se per stabilità numerica intendi precisione, allora sì, potresti finire con problemi di precisione. A seconda del rapporto tra i valori più grandi e quelli più piccoli e i requisiti di accuratezza nel risultato, questo può o meno essere un problema.
Se vuoi avere un'elevata precisione, considera la somma di Kahan - questo utilizza un galleggiante extra per la compensazione degli errori. C'è anche una somma a coppie .
Per un'analisi dettagliata del compromesso tra precisione e tempo, consultare questo articolo .
AGGIORNAMENTO per C ++ 17:
Alcune delle altre risposte menzionano std::accumulate
. A partire dal C ++ 17 esistono delle politiche di esecuzione che consentono di parallelizzare gli algoritmi.
Per esempio
#include <vector>
#include <execution>
#include <iostream>
#include <numeric>
int main()
{
std::vector<double> input{0.1, 0.9, 0.2, 0.8, 0.3, 0.7, 0.4, 0.6, 0.5};
double reduceResult = std::reduce(std::execution::par, std::begin(input), std::end(input));
std:: cout << "reduceResult " << reduceResult << '\n';
}
Ciò dovrebbe rendere più veloce la somma di set di dati di grandi dimensioni a costo di errori di arrotondamento non deterministici (suppongo che l'utente non sarà in grado di determinare il partizionamento dei thread).