Wie berechnet man den Sinus großer Zahlen?

8

Seit einigen Tagen frage ich mich, wie es möglich wäre, den Sinus großer Zahlen mit einer Größenordnung um 100000! (Bogenmaß) zu berechnen. Die Fakultät ist nur ein Beispiel, die Zahl selbst kann beliebig sein und nicht nur ein faktorielles Produkt ...) Ich benutze offensichtlich nicht double , sondern cpp_rational aus der Boost-Multipräzisions-Bibliothek. Aber ich kann nicht einfach 100000! mod 2pi machen und dann die eingebaute Funktion sinl verwenden (ich brauche nicht mehr als 10 Dezimalziffern ..), da ich mehrere Millionen Stellen von pi benötige, um das genau zu machen.

Gibt es einen Weg, dies zu erreichen?

    
borchero 04.07.2016, 21:23
quelle

4 Antworten

5

Dies ist im Allgemeinen eine nicht triviale Aufgabe, da sie viele Ähnlichkeiten mit dem Problem des diskreten Logarithmus aufweist, was bedeutet, dass es ist wiederum eine rechenintensive Berechnung.
Das heißt, Ihre Berechnung könnte einfacher sein, wenn Sie den Logarithmus von 100000!/pi betrachten, da er sich auf die Summe der Logs aller positiven ganzen Zahlen gleich oder kleiner als 100000 reduziert und eine Subtraktion: log(N!/pi) = \sum_{i=0}^N (log i) - log(pi) . Wenn Sie diese Zahl potenzieren, erhalten Sie eine ungefähre Auswertung von (N!/pi) . Subtrahieren Sie den ganzzahligen Teil und multiplizieren Sie das Ergebnis mit pi . Dies ist die Schätzung Ihrer N! mod pi .
In der Formel:

Wie Sie vielleicht bemerken, habe ich oft das Wort approximate verwendet. Dies liegt an den folgenden Überlegungen:

  • Sie müssen viele log s berechnen, die einige Kosten und Fehler enthalten
  • Vielleicht möchten Sie die Basis Ihres Protokolls entsprechend Ihrer Problemgröße ändern. Dies wirkt sich wiederum auf die Genauigkeit und Präzision Ihres Ergebnisses aus
  • Sie müssen zurück potenzieren: kleine Fehler können zu großen führen
  • subtrahieren große Zahlen: kann zu großen Stornierungen führen
  • multiplizieren Sie mit pi und bewerten Sie die sin : again errors

Wenn Sie denken, dass es nützlich sein könnte, sollten Sie die Stirling-Annäherung in Erwägung ziehen.

Als letzte Bemerkung gibt es keine einfache Lösung für diese Art von Problemen, Sie müssen sich immer mit ihnen befassen.

    
fedino 05.07.2016 08:23
quelle
0

Wikipedia listet viele trigonometrische Identitäten auf. Einige enthalten Produkte im Argument, wie Chebyshev-Methode , die rekursiv ist, aber die Rekursion könnte mit Chebyshev Polynomials und / oder Memoization. Wenn Ihr Argument so einfach zu bewerten ist wie ein Faktor, dann könnte dies eine praktikable Methode sein.

    
John 05.07.2016 23:23
quelle
0

Hinweis:  = pi

Um die Sünde einer sehr großen Zahl im Bogenmaß zu berechnen (Ändere sie zu Vielfachen von , indem du durch 3.1415 dividierst)

1. Beachte das: sin 0 = 0, sin 0.5pi = 1, sin pi = 1, sin1.5pi = -1, sin 2pi = 0
2. Gerade oder ungerade ganzzahlige Werte vor Pi, die Sünde ist 0 3. Für reelle Werte (solche mit Dezimalpunkten), für gerade Zahlen vor dem Dezimalkomma, nehmen Sie sie als 0. Etwas wie der Wert des Sinus, für ungerade, dann nehmen Sie die 1. etwas als Wert des Sinus.
4. Siehe Beispiele * Beachten Sie, dass Sin und Cosinus periodisch sind, deshalb ist es möglich, dies für große oder kleine Zahlen zu tun. :)

z. (Verwenden Sie Ihre Rechner, um die Berechnungen zu überprüfen)

1.0 Im Bogenmaß: sin 100 = -0.506
Teilen durch 3.1415
Machen Sie in Grad
Sin 31.831pi (31.831 ist ein reeller Wert) = sin1.831 (180) = -0.506, check

2,0 Im Bogenmaß: sin 50 = -0,2623
Teilen durch 3.1415
Machen Sie in Grad
Sin 15.9155pi = sin1.9155 (180) = -0.2623

3,0 Im Bogenmaß: sin 700 = 0,5439
Teilen durch 3.1415
Machen Sie in Grad
Sin 222,8169pi = sin0,8169 (180) = -0,5440, überprüfen

4.0 Im Bogenmaß: sin 15000 = 0.8934
Teilen durch 3.1415
Machen Sie in Grad
Sin 4774.6483pi = sin0.6483 (180) = 0.893, überprüfen Sie

Sie können sehen, dass alle Antworten mit der direkten Berechnung der Werte mit dem Rechner im Radiomodus ausgecheckt wurden. Hoffe, das ist hilfreich.

Wenn Sie ein Rechenprogramm schreiben wollen, dann sollten Sie den Algorithmus herausfinden.

    
Norlida Kamarulzaman 13.07.2016 06:45
quelle
-2

Vielleicht können Sie mit cpp_rational den Sinus direkt aus Ihrer sehr großen Zahl berechnen:

%Vor%

Wiederholen Sie diese Serie, bis keine (für Ihre Anwendung) signifikanten Änderungen auftreten. Auf diese Weise vermeiden Sie die Nummer pi vollständig.

    
CAF 05.07.2016 08:45
quelle

Tags und Links