Kommastellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

hey zusammen,

ich kann mir vorstellen, dass das hier eine sehr newbie-hafte frage ist aber ich komm einfach nicht drum herum sie zu stellen.
Für nen Auftrag soll ich ein Code schreiben der mir eine Annäherung an die Euler-Zahl gibt:

Code: Alles auswählen

def fak(x):
    if x > 1:
        return x * fak(x - 1)
    else:
        return 1
f = [(1/fak(n)) for n in range(20)]
print sum(f)
mein problem dabei ist nur, dass es mir als lösung einfach immer nur eine 2 angiebt. wie kann ich das problem lösen?
ich suche hier nicht leute die mir meine Aufgaben lösen, sondern eine Möglichkeit sie richtig darstellen zu können ;)

danke für Antworten!
greez menace
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

<jedimindtrick>Du willst Fließkommazahlen verwenden.</jedimindtrick>
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@menace: Und um solchen Fehlern selber auf die Spur zu kommen, hilft es oft auch sich mal die Zwischenergebnisse anzuschauen. Dann hättest Du nämlich nicht gefragt warum am Ende 2 heraus kommt, sondern warum `f` so aussieht wie es aussieht.

Code: Alles auswählen

In [505]: [1 / fak(n) for n in xrange(20)]
Out[505]: [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L, 0L, 0L, 0L, 0L, 0L, 0L]
Insgesamt kann man das übrigens effizienter als mit Rekursion schreiben. Selbst bei einem iterativen `fak()` könnte man hier noch eine Menge unnötiger Rechenschritte weglassen, wenn man mal überlegt wie die einzelnen, aufeinanderfolgenden Werte sich voneinander unterscheiden.
menace
User
Beiträge: 16
Registriert: Dienstag 9. November 2010, 08:53

@ BlackJack:
ich habe das mit den zwischenergebnissen nicht ganz kappiert.
heisst das ich soll jeden schritt einfach mal im direkten interface eingeben um zu sehen was passiert? oder gibts dazu noch etwas anderes als möglichkeit.
kannst du mir eine idiotensichere anweisung geben? ^^

als Lösung für mein Problem verwend ich jetz mal auf weiteres:
from __future__ import division
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

menace hat geschrieben:@ BlackJack:
ich habe das mit den zwischenergebnissen nicht ganz kappiert.
heisst das ich soll jeden schritt einfach mal im direkten interface eingeben um zu sehen was passiert?
Du meinst mit "direktes Interface" einfach eine interaktive Python-Shell? Dann: ja ;-) Zudem sind print-Anweisungen zum Debuggen auch hilfreich, um Fehler bei einem größerem Durchlauf finden zu können (bei einem einfachen Beispiel kann es ja durchaus mal sein, dass durch Zufall das richtige rauskommt, bei einem anderen Initialwert findet man dann aber doch einen Fehler)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten