PDA

View Full Version : [Visual C++] Creare una Look-Up Table


swarm
13-02-2006, 11:22
Salve

devo risolvere a breve un problema per me gravissimo...

il mio programma legge dei valori da un array, in pratica creo una lookup table della radice quadrata e leggo così i valori...

finora ho dichiarato una variabile globale

static float SQRTTAB[32768];

e la caricavo così

unsigned short val;

for (val=0;val<32768,++val)
SQRTTAB[val] = (float)sqrt((double)val);

però quando la uso, mi ritrovo tutti zeri all'interno....

come devo fare?

alesnoce
13-02-2006, 15:22
Butto là una risposta:
considerando che la dichiarazione della funzione radice quadrata è

double sqrt(double x);

float sqrtf(float x);

long double sqrtl(long double x);

mentre te hai scritto

SQRTTAB[val] = (float)sqrt((double)val);


ti consiglio di definire uno static double[] e fare il cast esterno a double anziché a float

71104
13-02-2006, 22:03
ma guarda te se ancora oggi devo vedere usati sti trucchetti da PC Underground (http://www.amazon.co.uk/exec/obidos/ASIN/1557552754/026-1519815-3054067)!!! :D

mitico libro che era quello... :)

alesnoce
14-02-2006, 08:43
Ho cliccato il link a pcunderground e mi ha incuriosito.
Se l'hai letto mi puoi dare per favore qualche esempio di argomento trattato?
In questo momento sto debuggando qualche migliaio di righe di codice c++ e, anche se applico poco e male le buone tecniche di programmazione, sono convinto che in c++ senza conoscere trucchetti pratici non si va da nessuna parte. :)
Ciao

71104
14-02-2006, 13:12
Ho cliccato il link a pcunderground e mi ha incuriosito.
Se l'hai letto mi puoi dare per favore qualche esempio di argomento trattato?
In questo momento sto debuggando qualche migliaio di righe di codice c++ e, anche se applico poco e male le buone tecniche di programmazione, sono convinto che in c++ senza conoscere trucchetti pratici non si va da nessuna parte. :)
Ciao non sono molto d'accordo se ho capito cosa intendi per "trucchetti pratici"... moltissimi programmi sono ottimi pur essendo totalmente privi di "hacks".
comunque si tratta di un libro che oggi non leggerebbe più nessuno: è dei tempi di Windows 95 e tratta argomenti e tecniche di programmazione spesso mirate su un risparmio di risorse che con l'hardware di oggi chiunque con un po' di buonsenso considererebbe veramente maniacale :)
parla molto di programmazione assembly; io quando lo lessi mi interessavo di grafica, e così mi interessava particolarmente il capitolo dove parlava della VGA standard: descriveva ranges di memoria e di IO della VGA e insegnava ad usarla IN ASSEMBLY x86!!! :D :D :D
a volte metteva addirittura pezzi di assembly in programmi Pascal...
oggi credo che quei programmetti neanche funzionerebbero più in modalità protetta... provando ad eseguirli dal CD fornito col libro ricordo che andavano perfettamente su Windows 98 ma già col 2000 qualcuno aveva problemi.
questa storia della tabella delle radici quadrate mi ha ricordato quel libro perché a un certo punto il libro parlando di grafica 3D e parlando di come realizzare le rotazioni, per velocizzare il calcolo di seno e coseno anziché calcolarli lì sul momento ne calcolava tantissimi che metteva poi in una tabella :mbe:
ovviamente tutto in assembly :sofico: :sofico:
roba da masochisti, ti posso veramente assicurare che programmare a quel modo con l'hardware di oggi è assurdo.

alesnoce
14-02-2006, 13:34
Mi sono espresso male dicendo trucchetti, forse era meglio dire esperienza di programmazione spicciola.
Per fare un esempio, nel programma che sto debuggando ci sono blocchi di codice che devono leggere stringhe, ed eseguire operazioni differenti a seconda di ciò che le stringhe contengono.
Con la stringa "boolA=false" nel codice seguente viene eseguito l'if iniziale !!!!!
if ( ((_action.find_last_of("true")) > (_action.size()-6)) &&
((_action.find_last_of("true")) > equalPosition) )
{
...................................
}
else if ( ((_action.find_last_of("false")) > (_action.size()-7)) &&
((_action.find_last_of("false")) > equalPosition) )
{
.....................................
}

e ho dovuto scrivere invece
if ( ((_action.find_last_of("true")) > (_action.size()-6)) &&
((_action.find_last_of("true")) > equalPosition) &&
((_action.find("false")) == string::npos) )
{
....................................
}
else if ( ((_action.find_last_of("false")) > (_action.size()-7)) &&
((_action.find_last_of("false")) > equalPosition) &&
((_action.find("true")) == string::npos) )
{
....................................
}

per ottenere un funzionamento corretto.

Lo so che è un "trucchetto" inelegante, però funziona :)

Qu@ker
14-02-2006, 15:16
Con la stringa "boolA=false" nel codice seguente viene eseguito l'if iniziale !!!!!


Non capisco, se stanno ricercando l'ultima occorrenza di false o true perche' non utilizzano string::rfind()?

alesnoce
14-02-2006, 15:25
Non capisco, se stanno ricercando l'ultima occorrenza di false o true perche' non utilizzano string::rfind()?

Perché sono ignorante..
Con questa osservazione credo tu mi abbia risolto molti problemi, sarà meglio che mi studi meglio i metodi di string

swarm
15-02-2006, 12:41
raga mi dispiace di aver sollevato un polverone :sofico:

cmq vi ringrazio moltissimo, anche se alla fine ho risolto facendo direttamente la sqrt().....

era solo un modo per fare prima, in quanto se ho ben capito la velocità computazionale dell'accesso ai vettori è fissa, mentre quello della funzione può variare...

alla fine nn mi cambia nulla, quindi....

GRAZIE!!

71104
15-02-2006, 15:17
cmq vi ringrazio moltissimo, anche se alla fine ho risolto facendo direttamente la sqrt()..... te l'avevo detto io :rotfl:

swarm
15-02-2006, 15:23
te l'avevo detto io :rotfl:

infatti ora ho riletto con calma il tuo post...

la "tecnica" della look-up table infatti era usata da un vecchio software scritto in C su un 386-25Mhz.....

byez

alexanderf
17-02-2006, 09:30
Salve ragazzi co sto programmino in java che mi visualizza i numeri primi però no riesco a far visualizzare i suoi divisori. Esempio ciò 3 e divisible solo con 3 oppure cio 4 e divisibile con 2 e 4 ecc.
public class NumeriPrimi{
static int primo;
static int i;
public static String numeroPrimo(int primo){
if(primo==2){
return"è un numero primo";
}else if (primo==3){
return "è un numero primo";
}else if (primo==5){
return "è un numero primo";
}

if ((primo%2)==0) {

return"non è numero primo";
}else if ((primo%3)==0){
return"non è un numero primo";
}else if ((primo%5)==0){
return"non è un numero primo";
}
return"é un numero primo";

}

public static void main(String args[])
{
//NumeriPrimi primo = new NumeriPrimi();
String risposta=NumeriPrimi.numeroPrimo(3) System.out.println(risposta);
}
}

swarm
17-02-2006, 12:42
Salve ragazzi co sto programmino in java che mi visualizza i numeri primi però no riesco a far visualizzare i suoi divisori. Esempio ciò 3 e divisible solo con 3 oppure cio 4 e divisibile con 2 e 4 ecc.
public class NumeriPrimi{
static int primo;
static int i;
public static String numeroPrimo(int primo){
if(primo==2){
return"è un numero primo";
}else if (primo==3){
return "è un numero primo";
}else if (primo==5){
return "è un numero primo";
}

if ((primo%2)==0) {

return"non è numero primo";
}else if ((primo%3)==0){
return"non è un numero primo";
}else if ((primo%5)==0){
return"non è un numero primo";
}
return"é un numero primo";

}

public static void main(String args[])
{
//NumeriPrimi primo = new NumeriPrimi();
String risposta=NumeriPrimi.numeroPrimo(3) System.out.println(risposta);
}
}

aridaglie :p