Sommatoria

di il
17 risposte

Sommatoria

Ciao,qualcuno sa perchè questa sommatoria mi dà 0?
            somma=0.;
                    k=1;
                    p=20;
                    while (k<=p) {
                        somma+=1/(k*k*4-1);
                        k++; }
                        fprintf (fp,"somma:%12.7f",somma); 
Perchè non mi esegue il ciclo while?

17 Risposte

  • Re: Sommatoria

    Perché l'espressione deve essere

    somma += 1.0 / (k*k * 4 - 1);
  • Re: Sommatoria

    Perchè non mi esegue il ciclo while?
    Nel debug bisogna usare il cervello ancor di più rispetto a quando si scrive il codice... intendo dire che prima di autoconvincersi sarebbe meglio assicurarsi, per quanto possibile, della supposizione fatta!
    Il bello dell'informatica, rispetto ad altre materie quali la fisica o la chimica, è che abbiamo la possibilità di testare tutto attraverso il codice... quindi perchè non farlo?
    In questo caso l'esperimento che avrebbe potuto avvalorare o smentire la tua ipotesi consisteva nell'aggiunta di un semplice

    printf("SONO NEL CICLO");

    all'interno del while!

    Quindi, scartata l'ipotesi che non eseguiva il ciclo, avresti avuto maggiore probabilità di avere la giusta intuizione e di risolvere il problema in modo autonomo!

    P.S.
    Do per scontato che tu abbia capito il perchè del suggerimento di @oregon!
  • Re: Sommatoria

    Questa cosa del printf penso mi sarà molto utile , grazie. Penso che da solo non ci sarei mai arrivato, ieri ho perso un ora e mezza di tempo a capire dove sbagliavo a ricavare le y da una funzione, poi ho provato a mettere i puntini ad ogni numero e risolveva correttamente. L'espressione viene somma=1/3+1/15+numeri sempre più piccoli, quindi mi arrotondava tutto a 0? Avevo sottovalutato i puntini, son molto più importanti di quanto pensassi.

    A volte non capisco proprio come ragiona, ieri ho impostato un ciclo per il fattoriale , con fatt*=n (numero) funzionava, con fatt*=(n+1) funzionava, ma se mi azzardavo a mettere fatt*=(n*2) anche con 10 parentesi quello penso che capisse di fare fatt=2*fatt*(n)
  • Re: Sommatoria

    Come le espressioni matematiche anche le "espressioni informatiche" sono valutate secondo un ordine ben preciso che dipende dalle regole di precedenza tra i vari operatori coinvolti (oltre ovviamente al fatto che si procede sempre da sinistra verso destra). Questo per dire che con un minimo di studio non c'è alcun bisogno di andare a tentativi.

    Per quanto riguarda la questione puntini: sai che in base al tipo degli operandi coinvolti nella divisione, il quoziente può essere valutato come divisione intera o divisione non intera?

    Per i vari casi che hai citato non me la sento di darti una risposta in assenza di informazioni più dettagliate. Se hai qualche dubbio riguardo ad una specifica espressione, posta il codice completo e compilabile insieme alla risposta data dal programma e al risultato che invece ti aspetteresti.
  • Re: Sommatoria

    Grande ! Grazie mille,il programma gira: 0,48 viene la sommatoria.

    Non me la so proprio spiegare la situazione del fattoriale:
    l=3.;
                    fatt=1.;
                    for (j=l;j>=1;j--) {
                        fatt=fatt*(j);}
                        fprintf (fp,"fattoriale:%12.2f\n",fatt); 
                        
    fattoriale=6
     l=3.;
                    fatt=1.;
                    for (j=l;j>=1;j--) {
                        fatt=fatt*(j+1);}
                        fprintf (fp,"fattoriale:%12.2f\n",fatt); 
    fattoriale=24
     l=3.;
                    fatt=1.;
                    for (j=l;j>=1;j--) {
                        fatt=fatt*(2*j);}
                        fprintf (fp,"fattoriale:%12.2f\n",fatt); 
    fattoriale=48

    I primi 2 vengolo esatti,ma quanto tira fuori la moltiplicazione non capisco che cosa faccia,dovrebbe fare fattoriale di 6, invece quello non è fattoriale di nessun numero intero, non so da dove lo prenda sinceramente.
  • Re: Sommatoria

    Non mi pare che quei frammenti di codice siano compilabili!

    In ogni caso:
    - cosa c'entrano i valori in virgola mobile con il fattoriale?
    - il primo codice calcola l!, gli altri due invece?
  • Re: Sommatoria

    L va senza puntino,vero?

    Non son compilabili che significa?Son una parte di tutto l'esercizio, i risultati che vengono li ho scritti sotto ogni testo. Io dovei calcolare (l*2)!/(l+1)!*(l)!) per l=14. Ma visto che non mi veniva allora l'ho semplicato e ho deciso di procedere per gradi.
    -il primo codice calcola (l)!;
    -il secondo (l+1)! ( che potrei scomporre in (l+1)*(l)! quindi quà il problema non sussiste);
    -il terzo (l*2)!;
    O almeno cosi avevo previsto. le condizioni del for sarebbero (j=l;j>=0;j--), sopra la l sembra un 1.
    Ho provato a calcolare (l+2)! e viene sballato , il fatto che (l+1)! viene esatto è solo un caso, però con l! viene con tutti i numeri. Se metto( l+2) in effetti il ciclo mi fa: (3+2)*(2+2)*(1+2)=60, il fattoriale corretto sarebbe (3+2)*(2+2)*(1+2)*(0+2), perchè non entra nel ciclo con j=0?Anzi,ci entra, avevo scritto j>=1 .
    Però se metto l! adesso mi immagino mi dia 0.
    Con la moltiplicazione fa: (3*2)*(2*2)*(2*1)=48 se j>=1 , quindi devo fare tipo (3+2+1)*(2+2+1)*(1+2+1)*(0+2+1)*(0+1+1) quindi mi servirebbe un contatore che parta da 4 e scenda a 0 rendendo l espressione (2+j). Possibile che per risolvere l equazione sopra devo fare 3 cicli diversi?
  • Re: Sommatoria

    Non ti serve una funzione divisa in 3: ti serve una funzione che calcoli il fattoriale. Una volta che hai una funzione testata che calcola il fattoriale, il tuo programma diventa:
    int main(int argv, char **argc){
       int l;
       double x;
       
       l = 14;
       x = fatt(l*2)/fatt(l+1)*fatt(l);
       printf("Per l=%d --> %f\n", l, x);
       return 0;
    }
    (Il risultato è 20325889640780921862562512896.0)
  • Re: Sommatoria

    Se fatt() ritorna un double ok, ma se ritorna un int il risultato di quell'espressione sarà sempre caratterizzato da una componente decimale pari a 0, in quanto la divisione è valutata tra due interi!
  • Re: Sommatoria

    Non l'ho scritto espressamente, ma se scrive la funzione fatt che ritorna un int, si accorgerà che con il fattoriale non andrà molto lontano... La mia Casio FX del 1983 riesce a calcolare 69!, ma 70! da già errore di overflow... Con double il GCC-64bit mi ha fatto 100 senza problemi (a parte la precisione del calcolo stesso).
  • Re: Sommatoria

    Ho deciso che d ora in poi i puntini li metto ovunque , anche negli int,poi dove mi dà errore li tolgo, alla fine di int uso solo i contatori per i cicli for/while, gli altri li butto tutti in double,anche il numero di sottointervalli.
    int main(int argv, char **argc){
       int l;
       double x;
       
       l = 14;
       x = fatt(l*2)/fatt(l+1)*fatt(l);
       printf("Per l=%d --> %f\n", l, x);
       return 0;
    }
    E' una funzione esterna al main quella? Noi usiamo la forma
    
    double funz (double x) {
    double y;
    y=x*x*x; (per esempio)
    return y; }
    
    o 
    
    double funz (double x) {
    return x*x*x; }
    
    Già una funzione con 2 variabili non non saprei come dichiarala (oggi ho dato l'esame, mi chiedeva di dichiarare una funzione in ansi c con 3 variabili e l'ho lasciata in bianco annullando tutto l'esercizio )

    se invece intendevi il programma con quel codice sopra noi usiamo solo

    int main (void) {

    return 0; }
  • Re: Sommatoria

    Ho deciso che d ora in poi i puntini li metto ovunque , anche negli int,poi dove mi dà errore li tolgo
    Ma sì... melius abundare quam deficere!
    alla fine di int uso solo i contatori per i cicli for/while, gli altri li butto tutti in double,anche il numero di sottointervalli.
    Auguri allora!

    Una domanda: come faresti per valutare l'uguaglianza tra due double?
    Già una funzione con 2 variabili non non saprei come dichiarala
    Non conosci la virgola?
  • Re: Sommatoria

    A volte il compilatore mi dice che al posto del %d va il %f , poi lo cambio ed il gioco è fatto. Uguaglianza di 2 double in che senso? IL simbolo di uguaglianza è == , ne dichiaro uno poi l altro lo metto uguale a quello per esempio. Per vedere se son uguali invece potrei fare un ciclo if
    
    if (a == b) {
    fprintf (fp," a=b"); }
    else {
    fprintf(fp," a diverso da b"); }
    Non avendolo mai fatto o mai visto con più di una variabile non sapevo come fare, avevo provato con

    double funz (double x,c0) {
    ...
    }

    ma dava lo stesso una marea di errori.
  • Re: Sommatoria

    Non esistono "cicli if"
Devi accedere o registrarti per scrivere nel forum
17 risposte