|
|
|
|
Strumenti |
12-02-2008, 21:45 | #1 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
[C] Valore assoluto di un numero + velocemente possibile
Ciao Ragazzi,
sapete dirmi qul'è secondo voi il modo più veloce per ottenere il valore assoluto di un numero siccome lo devo calcolare tante volte? Io pensavo alla seguente funzione: int abs(int x) { return (x > 0) ? x : -x; } che ne dite?
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
12-02-2008, 21:53 | #2 |
Senior Member
Iscritto dal: Jul 2007
Messaggi: 493
|
unsigned int
__________________
|
12-02-2008, 21:57 | #3 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
In uscita voglio che sia dello stesso tipo che in ingresso. Poi è ovvio che sarà positivo.
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
12-02-2008, 22:12 | #4 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
#define ABS(x) ((x) > 0) ? (x) : -(x);
|
13-02-2008, 09:34 | #5 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Non va bene.
Considera (è in java, ma non cambia): Codice:
class twocompl { public static void main(String[] args) { int x = -2147483648; System.out.println(myAbs(x)); } private static int myAbs(int x) { return (x > 0) ? x : -x; } } c:\> java twocompl -2147483648 <-- OMG!!1 Il tuo problema è più accentuato perchè stai lavorando in C, quindi la dimensione dell'int varia da macchina a macchina. Fatti due conti.
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
13-02-2008, 10:19 | #6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53963
|
Credo che il più veloce sia questo:
Codice:
unsigned int iabs(int a) { return ~a + 1; } |
13-02-2008, 11:08 | #7 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
Ma sei sicuro che la tua funzione non faccia solamente un cambio di segno? cioè se a = 5 => ritorno = -5 e se a = -8 => ritorno = 8
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
13-02-2008, 11:11 | #8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53963
|
Sì che testa
|
13-02-2008, 11:15 | #9 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
Di nulla figurati
Mi sa che la più veloce è la mia... Ho provato con il quadrato al posto del valore assoluto e ho avuto un miglioramento di circa il 25% sulla velocità totale dell'algoritmo. Però dai un modo più veloce ci deve essere
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
13-02-2008, 11:40 | #10 |
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
hai provato la macro?
|
13-02-2008, 11:53 | #11 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53963
|
Con il quadrato però perdi parte dello spazio degli interi.
|
13-02-2008, 12:23 | #12 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2745
|
Ma com'è codificato in bit un numero positivo e uno negativo? Lo avevo fatto alle superiori ma non me lo ricordo più...
|
13-02-2008, 13:11 | #13 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
Se il primo bit partendo da destra è uguale a 0 allora è positivo altrimenti è negativo. Ricorda però il complemento a 1.
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
13-02-2008, 13:12 | #14 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
Purtroppo lo so ed è per questo che non lo voglio usare. Era per fare una prova di quanto succhia l'if.
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
13-02-2008, 13:16 | #15 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
La macro da gli stessi risultati della mia funzione.
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
13-02-2008, 13:17 | #16 |
Senior Member
Iscritto dal: Nov 2005
Città: Arezzo
Messaggi: 1801
|
Ho provato a costruirmi un Look Up Table e sono passato dai 19ms con la mia funzione a 13ms.
Peccato però che debba usare quella LUT che è abbastanzza grande.
__________________
iMac 27" - Apple iPhone 4 16GB Nero Ho concluso trattative con: cletopolonia - lele11 - Palli - darkn3o - Res3rator - andyxx - ABCcletta - DyingSweetly - streke - spiderman4 - mickyjenny - bottoni - tancrozio - perno |
13-02-2008, 13:24 | #17 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2745
|
|
13-02-2008, 14:13 | #18 |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12068
|
...ovviamente hai effettuato un profiling per verificare incontrovertibilmente che ottimizzando quella funzione otterresti *sensibili* vantaggi in esecuzione spero...
Altrimenti hai solo perso tempo sottraendolo alla scrittura di codice utile....
__________________
|
13-02-2008, 15:09 | #19 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
Se si tratta di studiare il problema sono d'accordo con TigerShark. E' sempre bene usare un profiling se si tratta di ottimizzare qualcosa.
E prima di ottimizzare con il profiling la maggior parte delle volte e' quasi sempre un problema di modello dati inadeguato. Una volta aggiustato il modello dati la situazione migliora da sola. Comunque non penso che questo caso sia effettivamente migliorabile, mantenendo la leggibilita' e l'universalita', rispetto a quanto ottenibile con la macro. Se invece si tratta di una gara, poiche' sono l'unico ad essere rimasto in ufficio durante la pausa pranzo, e poiche' da solo mi rompo abbastanza, io provo con questo: Codice:
int __inline absasm(int x) { __asm{ mov eax,x cdq xor eax,edx sub eax,edx } } Ovviamente e' ben poco universale. Molto poco. Se si prova a compilare con le __inline function si guadagna un 10% rispetto alla versione Macro (che penso sia comunque la preferibile e universale).
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
13-02-2008, 16:03 | #20 |
Bannato
Iscritto dal: Dec 2007
Messaggi: 42
|
prova così:
Codice:
int abs(int x) { int b=0x80000000,c=30; return (x*(((x&b)>>c)+1)); } Ultima modifica di MFSPO=DBGPOF : 13-02-2008 alle 16:15. |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:03.