Qual è il modo più accurato per contare una somma di elementi del vettore utilizzando std :: si accumulano? [duplicare]

StackOverflow https://stackoverflow.com/questions/6800810

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top