Motivo di particolare ordinamento di divisione e moltiplicazione in C ++
Domanda
Sono nel bel mezzo di porting del codice C ++ a Java, e continuo a correre attraverso casi in cui chi ha scritto ha mantenuto nel seguente modo:
double c = (1.0/(a+1.0)*pow(b, a+1.0));
double d = (1./(integral(gamma, dmax)-integral(gamma, dmin)))*(integral(gamma+1, dmax)-integral(gamma+1, dmin));
Al posto di:
double c = pow(b, a+1.0)/(a+1.0);
double d = (integral(gamma+1, dmax)-integral(gamma+1, dmin))/(integral(gamma, dmax)-integral(gamma, dmin));
Il secondo sembra molto più chiara, e se non mi sbaglio circa l'ordine delle operazioni in C ++ dovrebbero fare la stessa cosa. C'è qualche motivo per fare il primo e non il secondo? L'unica cosa che riuscivo a pensare sarebbe qualche caso strano con precisione.
Soluzione
Sì, sono la stessa cosa. L'unico motivo che mi viene in mente è la chiarezza matematica: a volte quando si sta normalizzando quantità, spesso scrive:
answer = (1/total) * (some of it)
Per esempio, il teorema integrale di Cauchy è spesso scritto
f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)
Altri suggerimenti
Se a
rimane la stessa e b
sta cambiando (per esempio, se il codice è in un ciclo ed è chiaro che a
non cambia tra due iterazioni, ad esempio perché si tratta di una variabile const
), quindi la versione originale può eseguire più velocemente , perché la moltiplicazione è più economico di divisione (supponendo che il compilatore sposta il calcolo di 1/...
fuori del ciclo).
Sembra un maldestro tentativo di ottimizzazione, se questa è la ragione, ma non vuol dire che non lo è.
Oh, e per quanto riguarda la precisione, la versione originale è in realtà un po 'meno preciso della tua, se non altro, perché non v'è un errore di arrotondamento supplementare per il 1/...
. E 'questo errore di arrotondamento che impedisce al compilatore di trasformare la versione nella versione originale di propria volontà:. Non calcolano esattamente la stessa cosa (ma le cose molto vicino)
Si dovrebbero fare la stessa cosa. L'autore originale può essere stato la replica di equazioni trovati altrove