Entwickler-Ecke
C# - Die Sprache - Berechnung eines Termes
HansW - Sa 12.04.14 19:11
Titel: Berechnung eines Termes
Hallo,
ich soll als Übung ein Programm schreiben, dass die unendliche Reihe ausrechnet, wobei der Term x/2^n kleiner als 0.00001 sein soll.
Wobei x eingelesen wird und somit "nur" n berechnet werden soll.
Jetzt meine Frage wie kann ich das machen? Reicht eine for schleife für o.g. Term aus?
Kann mir jemand einen Tipp geben? Komme einfach nicht drauf.
Gruß Hans
Christian S. - Sa 12.04.14 19:24
Da gibt es zwei Möglichkeiten: Du kannst Dir aus x/2^n < 0.00001 ausrechnen, bis zu welchen n Du gehen musst und dann mit einer for-Schleife arbeiten, oder Du nimmst eine while-Schleife und prüfst in jedem Schleifendurchlauf, ob die Bedingung nun erfüllt ist.
HansW - Sa 12.04.14 20:07
Vielen Dank Christian für die schnelle antwort.
Kannst du mir etwas mehr helfen? Wie meinst du das genauer mit der while-schleife?
Ich weiß nicht wie ich das n setzen soll bzw. die ganze Formel. Wäre es nur z.b. x/n würde ich es sofort wissen aber mit 2^n...
Gruß
Christian S. - Sa 12.04.14 20:24
Mit der while-Schleife meine ich das so, dass Du halt den Term, den Du zur Reihe addierst, ausrechnest und in der Bedingung der while-Schleife prüfst, ob der kleiner als 0.00001 ist.
Den Rest Deiner Frage verstehe ich nicht ganz ;-)
HansW - Sa 12.04.14 20:48
Vielleicht sollte ich erst mal komplett alles auflegen.
Die unendliche Reihe meiner Aufgabe sieht wie folgt aus:
x/2^n = x/1 + x/2 + x/4 + x/8 + x/16 usw.....
n = 0 bis unendlich
Aufgabe ist es Zitat "Zahl x einliest und die obige Summe so lange berechnet, bis der Term x/2n kleiner als 0.00001 wird".
Meine Idee war es jetzt, dass ich erst n berechne, dann weiß ich ja, wie "weit" ich auf der rechten Seite gehen muss und kann dann die Summe berechnen.
Ich steh halt nur auf dem Schlauch wie ich das mit dem n machen soll.
Sorry das ich so lange um den heißen Brei rumgeredet hab, hätte ich gleich in meinem ersten Post direkt reinschreiben sollen.
Christian S. - Sa 12.04.14 21:18
Die Gleichung nach n umstellen machst Du so:
Quelltext
1: 2: 3: 4: 5:
| x / (2^n) = y (y ist in Deinem Fall 0.00001) x / y = 2^n log(x/y) = log(2^n) log(x/y) = n * log(2) n = log(x/y) / log(2) |
Dann ist n natürlich erst einmal keine ganze Zahl, da nimmst Du dann die nächste ganze Zahl, die größer ist.
HansW - Sa 12.04.14 21:46
Super! Vielen Dank.
Jetzt ist mir fast peinlich, dass ich danach gefragt hab ;-).
Wahrscheinlich hab ich es mir schwerer gemacht als es ist.
Ich probiers morgen früh gleich mal aus und werde hier nochmal berichten.
HansW - So 13.04.14 09:27
Noch eine kurze Frage:
Wenn ich für x = 1 einlese. Kommt ja 16, raus dann runde ich das auf 17. Wenn ich jetzt die rechte Seite mit 17 Brüchen versehen will, brauch ich dann zwei for schleifen?
Gruß
Christian S. - So 13.04.14 10:03
Ich vermute, Du willst in der zweiten Schleife dann 2^n ausrechnen? Das brauchst Du nicht, Du merkst Dir einfach, durch was Du im vorhergehenden Schritt geteilt hast und nimmst das für den nächsten Schritt mal Zwei.
HansW - So 13.04.14 10:15
Ich möchte mit der for-schleife die summe der rechten Seite ausrechnen.
Wenn ich ja aber jetzt die for schleife wie folgt setze:
for (i = 1; i <= n; i = i * 2)
geht mein i ja nur bis <= n was in diesem fall 17 wäre.
Christian S. - So 13.04.14 10:51
Du lässt i ganz normal von 1 ... n laufen (ohne es immer zu verdoppeln, einfach nur +1 pro Schleifendurchlauf) und tust das, was ich eben geschrieben habe ;-)
HansW - So 13.04.14 11:17
Meinst du das in etwa so? Oder liege ich da gänzlich falsch?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for (double i = 1; i <= n; i++)
{
summe += x / i; summe = summe * 2;
} |
Moderiert von
Christian S.: C#-Tags hinzugefügt
Christian S. - So 13.04.14 11:33
Ja, zum einen teilst Du nur durch i und zum anderen verdoppelst Du nochmal die Summe, das ist natürlich Quatsch. Der Algorithmus sollte eher so aussehen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| initialisiere summe = 0 divisor = 1
i = 1 ... n für jedes i: addiere x / divisor zur summe verdopple den divisor |
Alternativ kannst Du das Spiel auch mit dem kompletten Summanden machen und den immer halbieren.
HansW - So 13.04.14 11:44
Ok. Vielen Dank, dass du mir geholfen hast!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!