Newsgroup: it.comp.lang.c
Titolo: Problema con la gestione di numeri complessi

Salve,
mi chiamo Luigi, sono da poco tempo alle prese con la programmazione in
C e non si puo´ certo dire di me che sono un "programmatore" (sono
scarsissimo).
Ho la necessita´ di manipolare matrici complesse e mi servirebbe un
qualcosa (struttura???) che mi permetta di definere una matrice
complessa e delle operazioni fondamentali sugli elementi della suddetta
(in particolare somma, sottrazione, moltiplicazione, divisione e radice
quadrata).
In un altro NG mi hanno suggerito di utilizzare la libreria complex, ma
il grosso problema e´ che devo implementare il programma su un DSP e
questa libreria gira soltanto sotto win32 o mac.
Come potrei definire questa struttura e le operazioni che ho elencato?
Come potete intuire necessiterei del sorgente...
Spero di ottenere qualche risposta...
grazie!
Luigi Lescarini

 Come potrei definire questa struttura e le operazioni che ho elencato?
Beh, se proprio vuoi implementartela basta definire un numero complesso
cosi`:
/* Complesso in forma algebrica z = a + ib*/
typedef struct {
	int r;	/* Re(z) */
	int i;  /* Im(z) */
} complex;
Poi  ti  definisci  tutte  le  operazioni  che  vuoi  (somma,  prodotto,
coniugato, modulo, ecc.), non sono molto difficili.
Es:
complex somma (complex const a, complex const b) {
	complex tmp;
	tmp.r = a.r + b.r;
	tmp.i = a.i + b.i;
	return tmp;
}
complex prodotto (complex const a, complex const b) {
	complex tmp;
	tmp.i = a.r * b.i + a.i * b.r;
	tmp.r = a.r * b.r - a.i * b.i;
	return tmp;
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Io mi ricordo sempre il compleanno della mia ragazza:
cade il giorno dopo di quando lei me lo ricorda

 }
Grazie!
questa e´stata la mia prima idea... mi e´stato detto pero´che e´meno "veloce"
di questa differente implementazione (che non fa ritornare nulla alle
funzioni):
void sumcomp(complex *z, complex *x, complex *y)
{
z->real= x->real + y->real;
z->immag= x->immag + y->immag;
}
che ne dici?
in  pratica si lavora solo con i puntatori...mi sembra meglio...
vorrei una tua opinione. Se il codice non ti e´chiaro posso postare il resto.
ciao!
Luigi

 in  pratica si lavora solo con i puntatori...mi sembra meglio...
meglio? se ti sentono a parlare di puntatori...
e' piu' veloce in quanto richiede una copia in meno (quella del 
risultato), ma occhio che il 90% dei bug dei programmi derivano da un 
uso errato di puntatori, array e gestione della memoria in genere


I Veri Programmatori usano i puntatori proprio per la loro capacita'
di bombare tutti se sbagli qualcosa :P
Scherzi a parte dipende da cosa devi farci.
Se devi eseguire migliaia di addizioni in succesione sui complessi
allora potresti anche pensare alla tua funzione sui puntatori perche'
il tempo guadagnato diventa un bel po'.. se ne devi eseguire solo un
centinaio beh vanno bene entrambe... anzi, e' meglio l'idea di Kronos
perche' piu' object oriented :)
Nota: Ricorda sempre che non sono le funzioni a rallentare i
programmi, ma mai quanto gli algoritmi (con complessita' alta
ovviamente). Fare una funzione veloce e' importante, ma secondario
rispetto a fare algoritmi veloci.
Mox :)

Capito!
Grazie!
In effetti il mio programma deve eseguire un bel po´ di operazioni sui
complessi, figurati che dovro´ ottimizzare addirittura il codice assembler
per velocizzare al massimo le sue prestazioni!
Cmq grazie dei consigli...
Luigi

 che ne dici?
Che se utilizzassi strutture molto  grosse sarebbe vero, ma la struttura
che utilizzi  e` piccola (due  interi) e  la differenza di  velocita` e`
veramente minima.
Cmq, io  una cosa  del genere  la farei in  C++, utilizzando  una classe
(oppure  la  struct  dell'esempio  stessa) e  facendo  l'overload  degli
operatori che ti servono: la cosa mi sembra piu` "bella".
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La somma dell'intelligenza sulla terra e` una costante.
La popolazione e` in aumento.

 rispetto a fare algoritmi veloci.
oltre a questo occorre anche ricordare che se il tuo programma dovra' 
essere utilizzato per anni consecutivamente o in sistemi real-time 
allora puo' avere un senso ottimizzare sino all'ultima goccia; 
altrimenti e' meglio passare qualche nanosecondo in piu' ad aspettare 
che il programma termini piuttosto che passare qualche ora a cercare un 
bug introdotta dalla mania di "ottimizzazione precoce".
ciao anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 un bug introdotta dalla mania di "ottimizzazione precoce".
vero e sacrosanto, tanto piu' che spesso il codice prodotto da un buon 
compilatore ottimizzante e' identico o migliore a quello che 
scriverebbe un bravo programmatore assembly, a parte il preambolo

 scriverebbe un bravo programmatore assembly, a parte il preambolo
anzi; contando che i processori moderni sono dotati di pipeline molto 
profonde (il Pentium II l'aveva a 12 stadi, non so P3 e Athlon) per un 
programmatore assembly e' piu' difficile generare codice migliore di 
quello prodotto da un buon compilatore.
ciao Anto


scriverebbe un bravo programmatore assembly, a parte il preambolo
Aaarrrghhh !!!  >:-(
ciao, acc.   
a...@libero.it

quello prodotto da un buon compilatore.
*Sigh* ...
ciao, acc.   
a...@libero.it