Die Berechnung einer Summe mit C++
Schrieb ich den folgenden code, um die Summe der Reihe (-1)^i*(i/(i+1))
. Aber wenn ich es bekomme ich -1
für jeden Wert von n.
Kann jemand bitte erklären, was ich falsch mache? Vielen Dank im Voraus!
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
int i = 1.0;
int n = 5.0;
for(i=1;i<=n;i++)
sum = (-1)^i*(i/(i+1));
cout << "Sum" <<" = "<< sum << endl;
return 0;
}
Was denken Sie, die
Und warum weisen Sie eine Gleitkommazahl auf eine Ganzzahl? (
gut ersten Ihrer Einstellung Summe jedem einzelnen Durchlauf der Schleife und nicht hinzufügen, um den vorherigen Wert. zweite ^ nicht aufbringen einer Kraft, wie Sie denken würde. check-out der c Mathematik-Bibliothek. und watch out für die impliziten Typumwandlungen, die passieren, wenn Sie teilen sich in eine Fraktion.
^
Betreiber übernimmt? Sind Sie versuchen, durchführen einer exklusiv-oder-operation, oder versuchen Sie zu führen Potenzierung?Und warum weisen Sie eine Gleitkommazahl auf eine Ganzzahl? (
int i = 1.0
)gut ersten Ihrer Einstellung Summe jedem einzelnen Durchlauf der Schleife und nicht hinzufügen, um den vorherigen Wert. zweite ^ nicht aufbringen einer Kraft, wie Sie denken würde. check-out der c Mathematik-Bibliothek. und watch out für die impliziten Typumwandlungen, die passieren, wenn Sie teilen sich in eine Fraktion.
InformationsquelleAutor Surfcast23 | 2012-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Problem #1: Die C++
^
Betreiber ist nicht der Mathe-power-operator. Es ist eine bitweise XOR.Sollten Sie verwenden
pow()
statt.Problem #2:
Sie sind speichern von Gleitkomma-Datentypen in einen integer-Typ. So wird Folgendes Ergebnis in integer-division (division abgeschnitten):
Problem #3:
Sie sind tatsächlich nicht Fazit etwas:
werden sollte:
Eine korrigierte version des Codes ist wie folgt:
Obwohl Sie wirklich brauchen nicht zu verwenden
pow
in diesem Fall. Einen einfachen test auf gerade/ungerade zu tun.Zusätzlich, da alle seine Variablen
int
s wird es tun integer math, undi/(i+1)
wird immer bewerten, zu 1, es sei denni == 0
oderi==1
zu
0
in der Tat.vergessen Sie nicht, über die Summe +=
Das war überraschend schwer zu fangen... hat mich ein paar min.
InformationsquelleAutor Mysticial
Müssen Sie zu setzen Summe += pow(-1,i)*(i/(i+1));
Sonst verlieren Sie bisherige Ergebnis jedes mal.
Verwenden pow-Funktion für pow Betrieb.
edit : wie gesagt im anderen post, verwenden Sie double oder float statt int zu vermeiden, abgeschnittene division.
InformationsquelleAutor ClemPi
Wie über diese
statt
?
Ausführliche Antwort:
InformationsquelleAutor Sergey Brunov
Paar Probleme:
^ teh bitweise exklusiv-oder-in c++ nicht "erhabene macht". Verwenden pow () - Methode.
Entfernen Sie die baumelnden öffnenden Klammer der letzten Zeile
Verwendung von ints nicht schwebt, wenn die Zuweisung an int-Werten.
InformationsquelleAutor Sid
Scheinen Sie ein paar Dinge, die falsch mit Ihrem code:
Dies ist nicht direkt mit Ihrem problem an die hand, aber nicht immer sagen
using namespace std;
Es führt subtile bugs.Sind Sie initializaing integralen Variablen mit floating-point-Konstanten. Versuchen
Haben Sie zwei Probleme mit diesem Ausdruck. Erstens, die Menge
(i/(i+1))
ist immer null. Denken Sie daran die Verteilung von zweiint
s Runden das Ergebnis. Zweitens^
tun nicht, was Sie denken, es tut. Es ist die exklusiv-oder-operator, nicht den potenzierungsoperator. Drittens^
bindet weniger stark als*
, so dass Ihr Ausdruck ist:Diskussion hier und here.
Danke für die links bezüglich der Verwendung von namespace std.
InformationsquelleAutor Robᵩ
^
nicht tun, was Sie denken, es tut. Es gibt auch einige andere Fehler in Ihrem code.Was es sein sollte:
Nehmen eine Leistung von Wert, nutzen
std::pow
(siehe hier). Auch Sie nicht zuordnen könnenint
ein decimal-Wert. Für die, die Sie verwenden müssenfloat
oderdouble
.Den genannten
^
ist Bitweises XOR, nicht eine mark für ein exponent.Seien Sie auch vorsichtig Integer-Arithmetik wie erhalten Sie möglicherweise unerwartete Ergebnisse. Sie wahrscheinlich wollen, um zu ändern Ihre Variablen entweder
float
oderdouble
.InformationsquelleAutor ssell
Gibt es ein paar Probleme mit dem code:
Zwischenergebnisse sind nicht ganze zahlen, sollte dies eine doppelte
Da Sie verwenden eine division, sollte es ein Doppel -, 1/2 ist 0, wenn, berechnet in Ganzzahlen.
Dies ist ein int, nicht eine floating-point-Wert, keine .0 benötigt wird.
Hast du bereits initialisiert ist ich 1, warum es wieder tun?
Jeder iteration verlieren Sie den vorherigen Wert, den Sie verwenden sollten, Summe+= 'neue Werte'
Auch, Sie brauchen nicht zu pow zu berechnen
(-1)^i
alle diese tut, ist der Schalter zwischen +1 und -1, je nach der gerade/ungerade statusi
. Sie tun kann dieser leichter mit einemif
- Anweisung oder mit 2for
's, eine für ungeradei
eine für sogar diejenigen... Viele Möglichkeiten wirklich.InformationsquelleAutor Andrei