Hallo zusammen,
ich bin gerade dabei nach einer Aufgabenstellung ein Programm zu
schreiben, durch das ich raus bekomme wie viele Zahlenreihen ich
benötige um auf 3.41 zu kommen.
π = 4/1 - 4/3 + 4/5 - 4/7 + ...
Das bekomme ich aktuell schon raus, allerdings mit einem manuellen
rausspringen aus der Schleife mit dem Break und anschließenden
durchschauen der Ausgabe.
--> mit 119 Zeichenketten komme ich auf 3.149996.
Ist es irgendwie möglich das ich beim Wert 3.41 aus der for-Schleife
springe?
Meine Vermutung ist das es hier einfach nicht nur die 3.41
berücksichtigt sondern auch die hinteren Stellen abgleicht. Hab auch
schon von 3.139999 bis 3.410000 abgefragt, hier springt er mir aber auch
nicht raus.
Kann mir jemand vielleicht einen Tipp geben wie das Programm nur die
3.41 beachtet? Ich hätte eben gerne noch das es so lange durchläuft bis
zur ersten 3.41 und dann eben stehen bleibt.
Flo F. schrieb:> schreiben, durch das ich raus bekomme wie viele Zahlenreihen ich> benötige um auf 3.41 zu kommen.
3.14 meinst Du, aber Du solltest zunächst einmal verstehen, wie
Fließkommazahlen überhaupt funktionieren. Das sind im Prinzip Brüche zur
Basis zwei, und viele dezimal gesehen "glatte" Brüche haben keine exakte
Repräsentation als binäre FLießkommazahlen. So wie z.B. 1/3 auch keine
exakte dezimale Repräsentation mit endlich vielen Ziffern hat.
Davon ausgenommen sind nur Brüche, die sich als 1/(2^n) darstellen
lassen, also etwa 0.5, 0.25, 0.125. Und damit auch deren Summen wie etwa
0.75 oder 0.875.
Da 0.01 keine exakte Repräsentation als Fließkommazahl hat, hat 3.41
auch keine.
Deswegen testest Du bei Fließkommazahlen niemals auf Gleichheit, sondern
nur auf größer/größergleich und kleiner/kleinergleich, oder auf
Intervalle.
Flo F. schrieb:> --> mit 119 Zeichenketten komme ich auf 3.149996.> schon von 3.139999 bis 3.1410000 abgefragt...
Gibt es bei deiner Rechnerrei überhaupt einen Wert der innerhalb dieses
Bereichs liegt, nicht das der "Übersprungen" wird.
pi >= 3.139 || pi <= 3.141
Das sieht auch etwas komisch aus. Dass gibt doch immer ein True, oder?
Flo F. schrieb:> Ich hätte eben gerne noch das es so lange durchläuft bis> zur ersten 3.41 und dann eben stehen bleibt.
Dann veränderst du die Abbruchbedingung deiner Schleife:
Flo F. schrieb:> for (count = 3; pi >= 3.139 || pi <= 3.141; count++)
Die Vergleiche müssen genau umgekehrt sein: Du willst die Iteration
fortsetzen, bis zu im gewünschten Intervall angekommen bist. Die
logische Verknüpfung ist dann auch anders ...
Außerdem willst du auch den Schleifenrumpf überdenken. Das geht ohne
if/else erheblich kürzer, einfacher und logischer.
Mit allem Respekt: Das ist ja ein furchtbar unverständliches
Geschreibsel.
Natürlich kann man erkennen, dass es um eine Variante der Leibnizschen
Näherung von Pi geht.
Offenbar geht es auch darum, eine Abbruchbedingung für die Schleife
festzulegen.
OK. Aber nun schreibe mal bitte die Aufgabenstellung hin. Dann wird
vielleicht klar, wo es hingehen soll.
Vermutlich ist der Kern der Aufgabe die Abbruchbedingung festzulegen und
zu begründen. Sagt Dir das Wort "Konvergenz" aus dem Matheunterricht
noch was? Was ist das?
Die Aufgabe ist nur ein Programm zur Berechnung der Kreiszahl pi mit der
Leibnizschen Nährung zu erstellen.
Die Frage lautet wie viele Reihenglieder werden benötigt, hier komme ich
eben auf die 119.
Na schön, Flo. Die Aufgabe ist leider fehlerhaft beschrieben, Deine
Annahme unbegründet, aber lassen wir das mal.
Ich rate Dir dazu, ganz genau zu überlegen, für welche Zahlenbereich die
Bedingung in Deiner for-Schleife wahr oder falsch ist.
Weiter rate ich Dir noch einmal im C-Buch nachzuschauen, was diese
Bedingung genau bewirkt.
Dann rate ich Dir, noch genau zu überlegen, welche zwei Zahlen, gemäß
der Aufgabenstellung die Zahl Pi "umgeben". Welche Rolle genau spielt
dabei die Anzahl der Stellen.
Abschliessend rate ich Dir, Dich mit der Darstellung von
Fliesskommazahlen im Computer noch einmal gründlich zu befassen. Welche
Zahlen kann man genau und welche nur mit einem gewissen Fehler
darstellen?
Flo F. schrieb:> for (count = 3; pi >= 3.139 || pi <= 3.141; count++)
Das ist eine Endlosschleife. Egal welchen Wert pi hat, die Bedingung "pi
ist größer gleich 3.139 ODER pi ist kleiner gleich 3.141" ist immer
erfüllt.
Natürlich kann man auch aus einer Endlosschleife herausspringen. Die
elegantere Lösung wäre freilich, sich die Abbruchbedingung für die
Schleife so zu überlegen, dass sie eben nicht endlos läuft.
Mark B. schrieb:> pi ist kleiner gleich 3.141
Pi ist weder kleiner noch gleich 3.141, da Pi, wenn ich mich recht
entsinne, 3.14159..... ist. Sollte man da nicht eher einen Wert nehmen,
der tatsächlich größer als Pi ist, damit Pi dann auch ne Chance hat,
überhaupt kleiner zu sein als der Vergleichswert?
Planlos schrieb:> Pi ist weder kleiner noch gleich 3.141
Das ist mir schon klar. Ich bezog mich auch nicht auf die transzendente
Zahl Pi, sondern auf die Verwendung der Variable pi im Code des
Themenerstellers. Dessen Vergleich so halt keinen Sinn ergibt. ;-)
schau mal hier:
https://www.ict4us.com/r.kuijt/de_pi.htm
also:
const float pi = 3.14;
und warum ist bei Dir:
pi = (4 / 1.0) - (4 / 3.0);
Ist bei Dir pi am Ende eine ganz andere Konstante als die Kreiszahl pi
gemeint ?
Könnte ja sein!
Woher hast Du nur das copy&paste Programm :-))
Robert K. schrieb:> und warum ist bei Dir:> pi = (4 / 1.0) - (4 / 3.0);>> Ist bei Dir pi am Ende eine ganz andere Konstante als die Kreiszahl
na komm, dass er das als Startwert nutzt um sich hoffentlich immer
weiter Pi anzunähern ist ja schon doch sehr offensichtlich, oder nicht?
'sid
Unabhängig von deiner Lösung frage ich mich warum man iteriert wenn man
das Endergebnis schon kennt. Ich würde erwarten, dass man bei
Unterschreiten eines Schwellwertes für die Änderung abbricht.
Pi-ter schrieb:> Unabhängig von deiner Lösung frage ich mich warum man iteriert wenn man> das Endergebnis schon kennt.
Gibt es in jedem Buch als Übungsaufgabe.
Flo D. schrieb:> Hallo zusammen,Flo schrieb:> Die Aufgabe ist nur ein Programm
1. 2 Namen schon mal ungünstig!
Theor schrieb:> Na schön, Flo. Die Aufgabe ist leider fehlerhaft beschrieben, Deine> Annahme unbegründet, aber lassen wir das mal.
warum lassen?
es muss doch mal deutlich gesagt werden das man normalerweise nicht aus
Schleifen springt, die sollen beendet werden wenn die Bedingung erfüllt
ist!
der Titel ist schon denkbar unglücklich!
C-Buch und lernen ist die erste Pflicht vor sinnlosem C&P
abgesehen davon sehe ich nur 2 Posting vom TO, der hat sich
offensichtlich längst verabschiedet, manche wollen solche Antworten halt
nicht hören oder lesen, sie wollen "nur" Lösungen.