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 user profile iconChristian 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!