Sommatoria in C++!!!

p4ngm4n
potreste dirmi come si fa a scrivere un programma che faccia una sommatoria???
ad esempio mi servirebbe scrivere la sommatoria per n che va da o ad infinito di $((-1)^n*x^(2n+1))/((2n+1)!)$
che serve per calcolare il seno di un angolo.
vi ringrazio

Risposte
codino75
che intendi per infinito?
un ciclo deve cmq fermarsi prima o poi, senno' il programma non termina oppure finisce la memoria del calcolatore.

p4ngm4n
penso che intende fissare una precisione... quindi quando non vale più questa precisione il ciclo si dovrebbe fermare

Cheguevilla
In pseudocodice
for (n=0;$f(n)-f(n-1) {
...calcolo...
if (n=max) break;
}
Dove $x$ rappresenta il livello di precisione desiderato e $max$ il numero massimo di iterazioni che si vogliono consentire al programma, per evitare che si vada oltre la capacità del tipo di variabile considerata.

p4ngm4n
scusatemi non ho formulato bene la domanda la condizione fino alla condizione di cheguevilla ero arrivato. e' proprio il calcolo che non riesco ad esprimere(della formula sopra)!!!

TomSawyer1
E' semplicemente
somma+=(pow(-1,n)*pow(x,2*n +1))/fact(2*n+1)

con fact una funzione che devi scrivere per il fattoriale.

p4ngm4n
giusto io pensavo di farlo senza usare le funzioni, ma verrebbe un codice molto lungo...
non esiste una funzione che fa il fattoriale?lo devo fare manualmente????
inolte mi serve math.h????

TomSawyer1
Si', ti serve math.h per pow. In math.h non c'e' una funzione per il fattoriale, ma ci metti due minuti a scriverla.

PS: per velocizzare un minimo, al posto di pow(-1,n) , dopo aver introdotto una variabile m=-1, scrivi m*m.

p4ngm4n
ok grazie.. il Ps non l'ho capito
se dichiaro m=-1 quando faccio m*m non viene 1???

TomSawyer1
Comunque, intendevo che devi scrivere m=m*(-1) e usare m al posto di pow(-1,n). Per n=0, tu avrai m=(-1)*(-1)=(-1)^0=1, per n=1, m=1*(-1)=(-1)^1=-1 etc.

Pow e' abbastanza lenta, quindi ti conviene fare cosi'.

p4ngm4n
for(i=1;i<=n;i++)
    m=m*m;
    fatt=1;
    n=0;
    somma=1;
    sommaprec=0;
    for(n=0;(somma-sommaprec)<prec;n++)
    {
        for(i=(2*n+1);i>0;i--)
        fatt=fatt*i;
        sommaprec=somma;
        somma=(m*pow(x,2*n+1))/(fatt);
        n++;
    }    




raga dove sbaglio???

TomSawyer1
Ci sono vari punti dove sbagli. C'e' un for di troppo..
Ci si mette prima a scrivere il codice corretto, percio'

   
    somma=1;
    sommaprec=0;
    m=-1;

    for(int n=0;(somma-sommaprec)<prec && n<max;n++){

        fatt=1;
        for(int i=(2*k+1);i>0;i--)
        fatt*=fatt*i;

        sommaprec=somma;
        m=-1*m;
        somma+=(m*pow(x,2*n+1))/(fatt);
    }    


Per prec intendi sommaprec o un'altra variabili? Ci sono ovviamente varie ottimizzazioni che si possono fare.

p4ngm4n
per prec intendo la precisione...

Maurizio Zani
Sostituisci 2*n+1 al posto di 2*k+1, e poi fatt*=i;

p4ngm4n
si adesso il programma gira... ke valore devo dare a max??? considerando che sto usando il tipo float e quali migliorie si potrebbero apportare? grazie per l'aiuto.

TomSawyer1
Ok, allora a posto. Il codice itera max volte oppure esce quando la f(n)-f(n-1) e' minore della precisione voluta.

Se hai bisogno di un codice piu' veloce, ottimizza il calcolo dei fattoriali.

p4ngm4n
mi sbagliavo... il programma non funziona correttamente.
praticamente il for non viene eseguito perchè il valore di somma rimane sempre 1

p4ngm4n
chiedo scusa per gli innumerevoli post. ora ho risolto. c'era solo un problema nel codice di tom.
il for non veniva eseguito perchè (somma-sommaprec) ho corretto con il > e adesso gira.
grazie per l'aiuto.

p4ngm4n
come faccio a fare $-1^(n-1)$???? con pow mi da errore xke n è dichiarata int. ho provato a convertire ma niente ...

TomSawyer1
"p4ngm4n":
chiedo scusa per gli innumerevoli post. ora ho risolto. c'era solo un problema nel codice di tom.
il for non veniva eseguito perchè (somma-sommaprec) ho corretto con il > e adesso gira.
grazie per l'aiuto.

Quello era il tuo codice :wink:, io avevo corretto altre parti.

Il (-1)^(n) è risolto dal discorso di prima sulla m; poi non ho capito perché ora vuoi calcolare (-1)^(n-1).

p4ngm4n
mi serve per un altro algoritmo...

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.