Frage von Zipfel1, 49

Visual Basic : Kalkulation von Pi als String?

Hallo, Ich möchte in VB.net Pi berechnen. Ich benutze die Formel 1/2 * n *sin(360/n) um das verhältnis des umfangs zum durchmesser eines n ecks zu berechnen. Wenn ich nun mit dem Taschenrechenr für n = 50000 rechne komme ich schon ziemlich genau hin. Nun meine Frage gibt es vb.net eine Möglichkeit pi in einem String zu speichern und auf mehrere 100 nachkommastellen genau zu rechnen?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von hypergerd, Community-Experte für Mathematik, 26

Deine Herangehensweise ist in mehrfacher Hinsicht ungenau und langsam.

Viele Rechner rechnen schon sin(x) nicht mal auf 15 Stellen genau aus -> und dann noch weiterrechnen -> erzeugt zig Rundungsfehler...

zu "Möglichkeit": ja, und das unabhängig von der Sprache, da mathematische Algorithmen universell sind.

Unter http://www.gerdlamprecht.de/Kreiszahl.htm  

habe ich über 100 Algorithmen zur Berechnung von Pi zusammengefasst. Viele kann man per LINK gleich mit dem Iterationsrechner online ausrechnen.

Wie man unter Punkt 5 sieht, gibt es bereits fertige Funktionen wie acos(-1), die Pi ausrechnen.

Mit "6. Bruch-Funktionen..." wie  226517876251716162692149071050771828410490449602080890536575346 / 72102879408277751642507260419334203501590758230297414247167791

kannst Du Pi auf 86 Stellen berechnen.

Dazu gibt es im Internet zig fertige Funktionen, die das Dividieren mit String-Zahlen realisieren.

§4d: 10 Iterationen und man bekommt 13 Mio. richtige Nachkommastellen! Problem ist nur die 5. Wurzel, die man per Iteration erst mal genau berechnen muss...

Wenn man richtig viele Stellen berechnen will, kannst Du alles mit .net vergessen, da diese "Interpretersprache" erst mit Microsoft "telefoniert" als direkt mit Deinen 8 CPU-Kernen!

Ganz am Ende findest Du y-cruncher (nutzt §2b): 1 Mrd. Stellen in etwa 4 min holt alles aus Deiner CPU heraus -> ist damit etwa 100000 mal schneller als .net!

Kommentar von Zipfel1 ,

Ich bin jetzt so weit ist leider Irre langsam. Kannst du mir sagen warum das so langsam ist und was mann verbessern kann?

und wie kann ich das ganze auf meinem RASPI 2b laufen lassen?

Imports System.Numerics

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim Stopw As New Stopwatch()

Stopw.Start()

Dim Nachkommastellen As BigInteger = TextBox2.Text

Dim Pi As BigInteger

Dim Pow As BigInteger = BigInteger.Pow(100, Nachkommastellen)

Dim Interruptionen As BigInteger = BigInteger.Add(BigInteger.Pow(10, BigInteger.Add(Nachkommastellen, 1)), 1)

For i = 1 To Interruptionen Step 4

Pi = BigInteger.Add(Pi, BigInteger.Divide(Pow, i))

Pi = BigInteger.Subtract(Pi, BigInteger.Divide(Pow, i + 2))

Next

Pi = BigInteger.Multiply(Pi, 4)

Stopw.Stop()

MessageBox.Show("3, " + Pi.ToString.Substring(1, Nachkommastellen), "Zeit : " + Stopw.Elapsed.TotalSeconds.ToString)

End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

Process.GetCurrentProcess.PriorityClass = ProcessPriorityClass.RealTime

End Sub

End Class

Kommentar von hypergerd ,

Hatte doch schon bei Iks72 kommentiert, dass atan(1) sehr langsam konvergiert! Habe das mal mit dem Iterationsrechner

d=i*4+1;aB[0]=aB[0]+b/d-b/(d+2);

überprüft: für 6 Stellen braucht man 10^6 Iterationen in 2s ...Und das schon beim Typ Double! Wenn man höhere Typen wie BigInteger oder String nimmt, wird es nochmals langsamer...(und mit jeder Stelle mehr wird jede einzelne Operation auch nochmals langsamer)

Damit die atan-Reihe x-x^3/3+x^5/5+...

schneller konvergiert, muss x sehr klein werden,was ich bei

http://www.gerdlamprecht.de/Kreiszahl.htm

 unter "1. atan-Reihen" beschrieben hatte z.B.

Pi=atan(1/18)*48+atan(1/57)*32-atan(1/239)*20

Aber selbst das wird langsam...

Warum nimmst Du nicht §4b oder §4c: mit nur 10 Iterationen etwa 1995 Stellen(benötigt jedoch die Wurzel, aber auch das geht per Newton-Iteration recht gut)

Oder §7h: keine Wurzeln und schon mit 6 Iterationen alle 15 Stellen richtig (keine Wurzeln)

Der LINK zum Iterationsrechner zeigt den einfachen Code

(3 Zeilen)

Antwort
von lks72, 49

Ich verstehe gerade den Sinn der Aktion nicht. Wie kommst du denn an die Sinuswerte? Machst du das mit einer Reihenentwicklung? Nach wie vielen Gliedern brichst du ab?

Kommentar von Zipfel1 ,

Es geht unter anderem darum wie ich den sinus genauer berechnen kann als mit Math.sin() da dort nur ein double zurückgegeben wird

Kommentar von lks72 ,

Dann schau dir die Reihenentwicklung von Sinus an, dies ist eine unendliche Summe von immer kleiner werdenden Brüchen, und es ist dir überlassen , wie viele du davon auswertest. In den Brüchen taucht nur Multiplikation und Division auf, dies lässt sich wohl so programmieren, dass man es in einen String ablegen kann.

Kommentar von Zipfel1 ,

Danke

Kommentar von lks72 ,

Außerdem, wenn es dir doch um PI geht, dann nimm doch eine Reihenentwicklung von pi, zum Beispiel die Formel von Leibnitz., die geht ohne Sinus

Kommentar von hypergerd ,

Die von Leibnitz {Pi=atan(1)*4 } konvergiert sehr langsam!

besser: Pi = 13260acot[7535]+12888acot[9703]+4424acot[57532]-5284acot[167318]+1592acot[529661/2]-460acot[664373]+3436acot[1048768]-2500acot[7042807]

ist ideal für 8 Kerne CPUs.

Kommentar von lks72 ,

Sorry, meine Leibniz, Leibnitz ist der Keks :-)

Antwort
von maximilianus7, 19

ich hab in vb.net nur die BigInteger class gefunden. durch skalierung (also verschiebung des dezimalpunktes nach rechts um z.b. 100 stellen) könnte man damit arbeiten - also jedes glied der (egal welcher) reihenentwicklung mit 10 hoch 100 multiplizieren.

das mit der geschlossenen sinus-funktion dürfte schwierig sein.

interessant vielleicht auch dieser eigenbau: http://www.vbforums.com/showthread.php?510529-Working-with-BIG-numbers-or-LOTS-o...

Keine passende Antwort gefunden?

Fragen Sie die Community