Berechnung der Nachkommastellen der Eulerschen Zahl

  • Halli hallo hallöchen.
    Heute komm ich mitm 2-Minuten-Skript...
    Man hat hier Skripte für exakte Berechnungen von pi, warum sollte dann die eulersche Zahl unter den Tisch fallen?
    Gerade weil die e-Funktion in der Oberstufe auch sehr wichtig ist, hab ich hier mal was geskriptet:

    [autoit]

    ;e-Berechnung
    ;by Twodollarbillie
    #include<bignum.au3>
    for $i=0 to 200
    $ergebnis= _bignum_pow((1+1/$i), $i)
    $pos= mousegetpos()
    Tooltip($i, $pos[0]+10, $pos[1])
    Next
    Tooltip("")
    Msgbox(0, "Ergebnis", "Die eulersche Zahl mit " & stringlen(stringtrimleft($ergebnis, 2))& " Nachkommastellen:"&@crlf &$ergebnis )

    [/autoit]


    Ist ziemlich mickrig :D Den Tooltip könnt ihr natürlich entfernen, verlangsamt das ganze wahrscheinlich. Den zweiten Parameter kann man natürlich auch verändern.
    Die Ergebnisse weichen von Wikipedia-Angaben noch ab, weiß nicht wieso. Kann jemand helfen?

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

    Einmal editiert, zuletzt von Twodollarbillie (15. April 2011 um 16:59)

  • Die Ergebnisse weichen von Wikipedia-Angaben noch ab, weiß nicht wieso.


    Du hast die Formel nicht verstanden.
    Überleg mal kurz was in deinem Programm passiert.
    Du rechnest 200 mal völlig unabhängig voneinander etwas aus und verwirfst es gleich wieder.
    Nach der Schleife wird nur ein Wert übernommen - nämlich das Ergebnis der Gleichung (1+ 1/200)^200.
    Alles vorherige existiert nicht mehr.
    Mathematisch sagt die Gleichung aber etwas völlig anderes aus.
    e entspricht nur dann dieser Gleichung wenn n nicht 200 sondern unendlich ist.
    Jetzt könnte man dafür eine unheimlich große Zahl angeben um das zu approximieren.
    Besser ist es jedoch einfach die Reihenentwicklung darunter zu verwenden.
    So müsste das ganze dann aussehen:

    Eulersche Zahl - noch falsch
    [autoit]

    #include<bignum.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $ergebnis = 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 100
    $ergebnis = _BigNum_Add($ergebnis, _BigNum_Div(1, _BigNumFak($i)))
    ToolTip($i)
    Next
    ToolTip("")
    MsgBox(0, "Ergebnis", "Die eulersche Zahl mit " & StringLen(StringTrimLeft($ergebnis, 2)) & " Nachkommastellen:" & @CRLF & $ergebnis)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _BigNumFak(Const $iN)
    ;by Aspirinjunkie
    Local Static $nOld = 0, $fOld = 1
    Local $df = 1, $iS = 2
    If ($nOld < $iN) And ($nOld > 2) Then
    $iS = $nOld + 1
    $df = $fOld
    EndIf
    For $i = $iS To $iN
    $df = _BigNum_Mul($df, $i)
    Next
    $nOld = $iN
    $fOld = $df
    Return $df
    EndFunc

    [/autoit]


    So sollte es eigentlich funktionieren.
    Die Zahl die herauskommt ist aber dennoch nicht die richtige.
    Das liegt allerdings nicht an der Berechnung sondern an einem Fehler in der _BigNumDiv().
    Diese gibt als Ergebnis für z.B. 1/3! nicht 0.1666... sondern 0.16 zurück.
    Oder für 1/5! 0.0083 statt 0.0083333333...

    Daher ist es in dem Fall mal besser auf die BigNum.au3 zu verzichten:

    Eulersche Zahl korrekt berechnet
    [autoit]

    Global $ergebnis = 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 30
    $ergebnis += 1/_Fak($i)
    ToolTip($i)
    Next
    ToolTip("")
    MsgBox(0, "Ergebnis", "Die eulersche Zahl mit " & StringLen(StringTrimLeft($ergebnis, 2)) & " Nachkommastellen:" & @CRLF & $ergebnis)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Fak(Const $iN)
    ;by Aspirinjunkie
    Local Static $nOld = 0, $fOld = 1
    Local $df = 1, $iS = 2
    If ($nOld < $iN) And ($nOld > 2) Then
    $iS = $nOld + 1
    $df = $fOld
    EndIf
    For $i = $iS To $iN
    $df *= $i
    Next
    $nOld = $iN
    $fOld = $df
    Return $df
    EndFunc

    [/autoit]
  • Zitat

    Diese gibt als Ergebnis für z.B. 1/3! nicht 0.1666... sondern 0.16 zurück.

    Das liegt daran, dass in der Bignum.UDF die Anzahl der Dezimalstellen standardmässig mit 0 angesetzt ist....
    Wenn du

    [autoit]

    $ergebnis = _BigNum_Add($ergebnis, _BigNum_Div(1, _BigNumFak($i),1000))

    [/autoit]

    einsetzt, gibts reichlich (richtige) Nachkommastellen

  • Danke dir - wieder was gelernt :)

    @twodollarbille
    Dann sieht das fertige Ergebnis nun so aus:

    Spoiler anzeigen
    [autoit]

    #include<bignum.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $ergebnis = 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 150
    $ergebnis = _BigNum_Add($ergebnis, _BigNum_Div(1, _BigNumFak($i), 100))
    ToolTip($i)
    Next
    ToolTip("")
    MsgBox(0, "Ergebnis", "Die eulersche Zahl mit " & StringLen(StringTrimLeft($ergebnis, 2)) & " Nachkommastellen:" & @CRLF & $ergebnis)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _BigNumFak(Const $iN)
    ;by Aspirinjunkie
    Local Static $nOld = 0, $fOld = 1
    Local $df = 1, $iS = 2
    If ($nOld < $iN) And ($nOld > 2) Then
    $iS = $nOld + 1
    $df = $fOld
    EndIf
    For $i = $iS To $iN
    $df = _BigNum_Mul($df, $i)
    Next
    $nOld = $iN
    $fOld = $df
    Return $df
    EndFunc

    [/autoit]