Xanth
Hallo,
ist es möglich, bei Visual Basic PI auf die Xte Stelle genau zuberechnen?
Wenn ja, wie?
Wenn nein, warum nicht?
Ich würd mich über ne Antwort freuen
Jöran
daHooligan
hammer hausaufgaben?^^
jein es ist nicht möglich
das problem liegt aber nicht direkt bei vb.net sondern an der "berechenbarkeit" von pi.
es gibt keine berechnungsmethode bei der mit jedem schritt ne bestimmte zahl stellen dazu kommt, da verändert jeder berechnungsschritt nicht nur eine stelle sindern vielleicht noch 1000 andere.
ansonsten sind je nach methode und arbeitsspeicher ne menge berechnungsschritte möglich, aber da kommste mit integer etc. nicht arg weit...
ganz angenehm zum programmieren und ne tolle idee wie ich finde ist die monte carlo-methode (
http://de.wikipedia.org/wiki/Monte-Carlo-Algorithmus)
Xanth
nein, keine Hausaufgabe...leider
Ja, ok, ich kann das aber nicht machen da:
ich nicht weis, was ich mit der Monte-Carlo Methode anfangen soll, ich kann die nicht umsetzen
ich bin ein mittelmäßiger VB-Programmierer, also wird das nichts...naja später einmal
Danke daHooligan
Jöran
daHooligan
monte carlo ist gar nich so schwer...
aus

folgt, dass pi = 4 * Treffer im Kreis/generierte Punkte
also lässt du zufällig punkte generieren, schaust bei jedem Punkt ob er im Kreis liegt (pythagoras) und wenn ja zählst du Treffer im Kreis um eins hoch.
Das lässte so 10^5 mal durchlaufen dann haste schon n ganz gutes ergebnis
Der limitierende Faktor bei der Umsetzung in VB liegt dann eigentlich nur noch in der GEnauigkeit der Zahlen mit denen du rechnest bzw. mit denen VB rechnet aber für den normalgebrauch ist das verwendbar
//kleine ergänzung:
der kreis hat radius 0.5 um den ursprung und das quadrat die seitenlänge eins mit den ecken (-.5|-.5), (.5|-.5), (.5|.5), (-.5|.5)
//noch mehr ergänzung
es gibt noch mehr methoden um pi zu approximieren (
http://www.activevb.de/rubriken/kolumne/kol_21/pi.html )
Xanth
Ok, wenn ich nun die Streifenmethode nehme, muss ich dann so machen:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
Public Class Form1
Private Function Pi(ByVal Stripes As Long) As Double
Dim I As Long 'zum Zählen
Dim OneStep As Double 'Breite eines Streifens
Dim S_Values As Double 'Zwischenspeichern der Flächeninhalte
If Stripes < 1 Then Stripes = 1000
OneStep = 1 / Stripes
For I = 1 To Stripes
S_Values = S_Values + Math.Sqrt(1 - (I * OneStep) ^ 2) * OneStep
If I / 10000 = I \ 10000 Then Application.DoEvents()
Next
Pi = (S_Values + OneStep / 2) * 4
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = Pi(1000000)
End Sub
End Class
|
|
Aber, der macht mir wieder nur ~16 Zeichen für jede Version die ich mit PI mache.
Wie kann ich dass nun weiterführen?
Jöran
daHooligan
das liegt daran, dass double nur 16 stellen darstellen kann. ab hier wirds mit vb.net-bordmitteln meines wissens schwer, da musste dir vllt. selber was stricken dass du auch längere zahlen darstellen kannst, da wirds aber auch schon ein paar fertige sachen geben, ich hab aber grad spontan keine idee wie das bei vb.net praktisch umzusetzen wäre
Xanth
man könnte es ja so machen:
Man nimmt die Zahl ( keine KOMMA Zahl, sondern eine Normale - / Ganzzahl ) und berechnet diese, so, dann nimmt man die erste Zahl ( 3 ) in Label1 und macht ein Label2 ( , ) und den Rest hängt man an ( Label3 = Der Rest )
daHooligan
das problem sind nicht deine label
das problem ist, dass deine double-zahl nicht genauer darstellen kann... das label hat damit nichts zu tun.... der speicherbereich für deine double-zahl erlaubt einfach nicht mehr als 16 stellen...
Xanth
KANN es sein, dass du mich falsch verstanden hast?
Ich meinte das so:
eine Doublezahl kann weniger speichern als eine Longzahl, so, wenn ich nun die berechnung in LONG durchführe, MÜSSTE die Zahl die ich anzeigen kann länger sein, oder?
daHooligan
achso.... klar aber long kann afaik nur ganzzahlen
chrigu99
Afaik. Sechzehntelszahlen. Doppelzahlen.