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.

È stato utile?

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

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