Qual è il modo più accurato per contare una somma di elementi del vettore utilizzando std :: si accumulano? [duplicare]
-
22-10-2019 - |
Domanda
Eventuali duplicati:
C ++ float questione di precisione
Ho un problema di determinare il metodo più preciso dei tre per calcolare la somma di elementi vettoriali, che può essere solo numeri positivi, utilizzando std :: accumularsi.
1)
double sum(vector<float> &v)
{
return accumulate(v.begin(), v.end(), 0.0);
}
2)
double sum(vector<float> &v)
{
sort(v.begin(), v.end());
return accumulate(v.begin(), v.end(), 0.0);
}
3)
double sum(vector<float> &v)
{
sort(v.begin(), v.end(), greater<float>());
return accumulate(v.begin(), v.end(), 0.0);
}
Questo è un tipo di domanda colloquio di lavoro, è per questo che ho ricevuto queste particolari tre modi per calcolare la somma. Ho fatto un sacco di ricerca sul web, ma non riuscivo a capire la differenza. La prego di aiutarmi ragazzi lo capiscono?
Soluzione
La differenza dovrebbe essere molto piccolo, ma a partire con i numeri più piccoli sarà leggermente più accurata. Si consideri per scopi espositivi che il numero in virgola mobile conteneva solo 4 cifre significative e un esponente, e che era decimale piuttosto che binario. Utilizzando i numeri:
a = 5000
b = 5000
c = 1000e4 (10000000)
Se si aggiunge c
prima, allora o a
o b
, il più piccolo dei due cade la rappresentazione ed è arrotondata. Il risultato finale di c
+ b
+ a
produrrà 1000e4
. Se d'altra parte, si aggiunge a
e b
primo otteniamo 1e4
come primo valore intermedio, e aggiungendo che a c
produrrà 1001e4
che è un risultato più preciso per l'operazione.