Voici mon code et j'essaye de calculer cette série: La vraie réponse à la fin doit être égale à ((-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;
}
-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?
3 Réponses :
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));
Une explication pourrait être utile ici. Pas (encore) mon vote défavorable.
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
.
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; }
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
Est-ce que ça marche?
sum1 + = (pow (-1.0, i)) * (((double) i) / ((double) i + 1.0));
Vous devez également initialiser vos variables, doncdouble sum1;
doit êtredouble sum1 = 0.0;
i
est de typeint
. 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.