1
votes

Synthèse d'une série

Voici mon code et j'essaye de calculer cette série: ((-1) ^ n) * n / (n + 1) qui n a commencé à partir de 1 code> à 5 , le code ne fonctionne pas correctement, n'importe qui peut vous aider?

int main(){

    int i,n;
    double sum1;

    for (i=1; i<6; i++)

    sum1 += (pow(-1,i))*((i)/(i+1));

    cout<<sum1;

    return 0;
}

La vraie réponse à la fin doit être égale à -0,6166666666666667 code> quel code ne peut pas le calculer correctement. J'ai calculé des séries à partir de ici . Y a-t-il une fonction spéciale pour faire la sommation?


10 commentaires

Est-ce que ça marche? sum1 + = (pow (-1.0, i)) * (((double) i) / ((double) i + 1.0)); Vous devez également initialiser vos variables, donc double sum1; doit être double sum1 = 0.0;


i est de type int . Par conséquent, (i) / (i + 1) est une division entière. Vous pouvez résoudre ce problème par exemple. (double) (i) / (i + 1) qui force un argument (et donc toute la division) à être fait avec des virgules flottantes.


votre boucle commence à 1, ne devrait-elle pas être à 0?


Votre sum1 n'est pas initialisé avant utilisation!


@Blaze --- Merci Blaze, puis-je faire quelque chose pour coder afficher la valeur exacte? Je veux dire que le code affiche -0.6166666666666667 au lieu de -0.616667 ?


Votre code ne correspond pas à votre question.


@Elia essayez ceci: std :: cout << std :: setprecision (15) << sum1 << std :: endl;


@Blaze --- Merci mon pote. Maintenant, son travail exactement.


@Blaze: pourquoi ne postez-vous pas tout cela comme réponse?


@ P.W bonne idée, je l'ai fait.


3 Réponses :


-1
votes

Essayez plutôt ceci

for (i = 0; i <= 5; i++) // from 0 to 5 inclusively
    sum1 += (pow(-1, i)) * (static_cast<double>(i) / (i + 1));


1 commentaires

Une explication pourrait être utile ici. Pas (encore) mon vote défavorable.



2
votes
  • Toujours initialiser les variables avant utilisation. double somme1 = 0;

  • ((i) / (i + 1)) effectue une division en entier , le résultat est 0 pour tout i .

  • Utiliser la fonction pow pour trouver la puissance de -1 est extrêmement irrationnel
  • int main() {
    
       int i;
       double sum1 = 0;
       double sign = -1;
    
    
       for (i = 1; i < 6; i++)
       {
          sum1 += sign * i / (i + 1);
          sign *= -1.0;
       }
    
       std::cout << sum1;
    
       return 0;
    }
    

0 commentaires

2
votes

Assurez-vous d'initialiser vos variables avant de les utiliser. Vous initialisez i par la suite donc c'est bien comme ça, mais sum1 doit être initialisé:

int main() {
    int i;
    double sum1 = 0.0;

    for (i = 1; i < 6; i++)
        sum1 += (pow(-1, i))*(((double)i) / ((double)i + 1.0));

    std::cout << std::setprecision(15) << sum1  << std::endl;
    return 0;
}

Pour la sommation, même si le résultat est affecté à un double , les résultats intermédiaires peuvent ne pas l'être et la dévision entière entraîne des valeurs tronquées. Pour cette raison, des doubles littéraux doivent être utilisés (comme 2.0 au lieu de 2 ) et i doit être casté le cas échéant:

sum1 += (pow(-1, i))*(((double)i) / ((double)i + 1.0));

Enfin, pour obtenir la précision souhaitée, std :: setprecision peut être utilisé dans l'impression. Le résultat final pourrait ressembler à ceci:

double sum1 = 0.0;

Sortie:

-0,616666666666667


0 commentaires