Wie kann ich eine Funktion erstellen, die die faktorielle Funktion (oder die Gammafunktion ) von Dezimalzahlen in JavaScript berechnet? Zum Beispiel, wie könnte ich 2.33!
berechnen?
Ich könnte eine bestehende Lösung gefunden haben ... Es ist eine Implementierung der Lanczos-Methode, ich fand sie in der schwedischen Wikipedia ( Ссылка ). Es wurde in Python geschrieben und sagt bis zu 15 Dezimalstellen korrekt aus. Ich portierte es auf js, kreuzte einige zufällige Werte gegen ( Ссылка ).
%Vor%(und natürlich unterstützt es keine imaginären Zahlen, da js nicht)
Dies ist kein triviales Problem. Für die Gammafunktion gibt es keine einfache Formel in geschlossener Form. Es gibt jedoch einige numerische Näherungswerte, die Ihren Anforderungen entsprechen sollten.
Die folgende Antwort verwendet eine Technik namens Lanczos-Approximation . Die Formel lautet wie folgt:
wobei g eine willkürlich gewählte Konstante ist, die steuert, wie genau die Approximation sein wird. Für größere g ist die Approximation genauer. A g (z) ist so definiert:
Der schwierigste Teil ist das Finden von A g (z), seit p n wird auch mit einer komplizierten Formel definiert, die von g abhängt .
Ich kann den folgenden Code nicht zu sehr anerkennen, da ich gerade einen Port des Python-Programms auf der Wikipedia-Seite schreibe.
%Vor%und natürlich nach Definition der Gamma-Funktion:
%Vor%Sie können dies in Aktion auf jsFiddle sehen.
Als eine Alternative zu den anderen Antworten hier, hier ist eine viel einfachere Approximation für die Gamma-Funktion, die 2007 von Gergő Nemes vorgeschlagen wurde. (Siehe die Wikipedia-Seite auf Stirling-Annäherung ).
Dies kann direkt in JavaScript in einer einzigen Zeile implementiert werden:
%Vor%Sie können dies in Aktion auf jsFiddle sehen.
Dies ist bis zu 8 Ziffern für z & gt; 8, aber es ist immer noch genau auf eine Handvoll Ziffern für kleinere z . Es ist nicht ganz so genau wie die Lanczos-Approximation, aber es ist einfacher und auch etwas schneller .
Beachten Sie, dass die Gamma-Funktion und die Fakultät-Funktion leicht unterschiedlich sind. Die Fakultät Funktion kann in Bezug auf die Gamma-Funktion definiert werden:
%Vor%Nur zur Vervollständigung von @apelsinapa, um die Berechnung für eine ganze Zahl zu korrigieren (wir haben bei der Eingabe einer ganzen Zahl keine ganzzahlige Lösung erhalten).
@ apelsinapas großartige Lösung:
%Vor%Und um eine korrekte Antwort für Integer zu erhalten:
%Vor%Hier ist eine Version, die ich vor ein paar Jahren geschrieben habe ... ein bisschen chaotisch, aber getestet:)
%Vor%Die Funktionen gamma und gammaLn sind dann:
%Vor%: -)
Wenn Sie nur nach der Funktion suchen, um faktorielle Zahlen von reellen Zahlen zu berechnen, brauchen Sie nur diesen Code aus der Lanczos-Näherung:
%Vor%Funktioniert hervorragend für negative Zahlen zusätzlich zu Dezimalzahlen.
Tags und Links javascript math factorial gamma-function