2013-02-27 12 views
5

Il mio programma utilizza Math.pow() per calcolare un numero doppio relativamente grande alla potenza di 2. Successivamente ho bisogno di trovare la radice quadrata di un doppio molto grande numero. Il problema è che devo farlo più di 100.000 volte e ci vuole davvero molto tempo. C'è qualche alternativa in grado di accelerare questo processo? GrazieJava: alternativa più rapida a Math.pow() e Math.sqrt()

Modifica: Per numeri elevati intendo tra 1000 e 10000 (quindi probabilmente non così grande in termini di calcolo). E in termini di tempo, impiega circa 30 secondi per eseguire la funzione 500 volte

+0

devi fare questa stessa operazione per 100.000 numeri univoci? – Brad

+5

Puoi definire "relativamente grande", "molto grande" e "veramente lungo"? – asteri

+0

http://stackoverflow.com/questions/7902418/the-best-alternative-of-math-pow-in-j2me – Brad

risposta

7

È improbabile trovare un'implementazione migliore (più veloce) rispetto a quella Java Math. Potresti avere più fortuna nel provare a cambiare il modo in cui esegui i calcoli nel tuo algoritmo. Ad esempio, esiste un modo per evitare di trovare la radice quadrata di un numero enorme?

Se questo non funziona, puoi provare a implementarlo in un linguaggio più appropriato che è pensato per i calcoli matematici veloci (qualcosa come Matlab).

In caso contrario, è possibile provare a ottimizzare questo in altre aree. Forse puoi provare a mettere in cache i risultati passati se sono utili in seguito.

+0

Beh, questo riguarda la formula della distanza euclidea, quindi non posso evitarlo – Matt9Atkins

+0

@ Matt9Atkins hai davvero bisogno della distanza euclidea? Si potrebbe usare il suo quadrato per i confronti ... –

+0

Bene, ci sono ancora opzioni per accelerare questo. Hai bisogno della distanza effettiva o stai semplicemente confrontandoli? Se li stai solo confrontando, puoi evitare la parte radice quadrata. – Oleksi

8

"La potenza di 2" è quadrata. Faresti meglio a farlo moltiplicando il numero da solo.

La versione di libreria di sqrt è probabilmente più veloce di qualsiasi altra cosa si possa cercare altrove. Se chiami una routine C, aggiungerai semplicemente un sovraccarico alla chiamata in più lingue. Ma hai bisogno di radici quadrate accurate, o farebbe una tabella di approssimazione? I valori si ripetono molto, cioè hai spesso bisogno di calcolare le radici degli stessi numeri? In tal caso, la cache delle radici quadrate in un HashMap potrebbe essere più veloce del calcolo.

1

Bene, il problema con la potenza di 2 può essere semplicemente moltiplicato per il numero. Per esempio, consente di dire variabile a è il numero che si desidera aumentare a 2. E 'lo stesso di: int a=5; int b=a*a;

0

È possibile utilizzare x * x al posto di pow (x, 2).

Per la radice quadrata, si dovrebbe prima dare un'occhiata all'implementazione di sqrt (metodo di approssimazione).

Forse è possibile trovarne uno migliore, ad esempio lo Newton's method (sull'equazione sqrt (N) -x = 0).

Dipende anche dalla precisione necessaria, è possibile scambiare l'accuratezza con il tempo.

È anche possibile memorizzare i risultati per evitare calcoli multipli sulle stesse voci.

+0

Sicuramente vuoi dire che puoi usare 'x * x' invece di' pow (x, 2) '. E sì, è certamente meglio calcolarlo come x * x. – NovaDenizen

+0

a destra, risolto ... – fso

1

l'unica cosa che posso pensare è memorizzare i risultati per la velocità, la radice quadrata non cambierà e ~ 9000 i numeri memorizzati non sono molti. Probabilmente faresti bene a incorniciare i tuoi dati, in modo che tu possa assicurarti di poter cercare in modo ottimale il risultato appropriato.