Python Programmiersprache, Programm was unendlich viele Nachkommastellen berechnet?

3 Antworten

Verwende das "decimal" Modul.

Beispiel:

import decimal
#Maximal 200 Nachkommastellen (bei Bedarf anpassen)
decimal.getcontext().prec = 200
#Berechne die Quadratwurzel von 2
print(decimal.Decimal(2).sqrt())

P.S.: "decimal" gehört mit zur Standardbibliothek, also keine weiteren Installationen erforderlich...

P.P.S.: Nicht Python hat 10~15 Nachkommastellen, sondern eine Variable vom Typ "float" in Python (und auch so ziemlich jeder anderen Programmiersprache...)


SwaghafterLEL 
Beitragsersteller
 13.12.2016, 23:32

könnte ich mit diesem code, auch 2 000 000 stellen ausrechnen?

0
Isendrak  13.12.2016, 23:35
@SwaghafterLEL

Bin mir nicht sicher, ob "decimal" da ne Begrenzung hat, ggf. einfach mal ausprobieren...

1
Isendrak  13.12.2016, 23:37
@Isendrak

Update: Habs gard mal mit 200000 (n Zehntel des gefragten ;) Nachkommastellen ausprobiert, läuft... Aber wie gesagt: Am besten ist immer noch, es selbst zu testen...

1
Isendrak  13.12.2016, 23:53
@Isendrak

Und hier kommt der Gratisbonus:

import decimal
decimal.getcontext().prec = 2000000
EINS = decimal.Decimal(1.0)

def GoldenerSchnitt(iterationen):
goldenerSchnitt = EINS
for i in range(0, iterationen):
goldenerSchnitt = EINS + (EINS / goldenerSchnitt)
return goldenerSchnitt

def Pi(iterationen):
pi = EINS
plus = False
divisor = decimal.Decimal(3)
for i in range(0, iterationen):
if plus: pi += EINS / divisor
else: pi -= EINS / divisor
divisor += 2
plus = not plus
return pi * 4

print('Das kann ne Weile dauern...')
print(Pi(99999999))
print('Das dauert jetzt auch nochmal ne Weile... Hol dir besser nen Kaffee (oder auch zwei (... Kannen))')
print(GoldenerSchnitt(99999999))
3
hypergerd  14.12.2016, 10:05
@Isendrak

Diese Leibnitz-Reihe {Pi=4*atan(1) } ist eine der langsamsten Algorithmen zur Berechnung von Pi-Nachkommastellen.

Pi=atan(1/57)*176+atan(1/239)*28-atan(1/682)*48+atan(1/12943)*96

konvergiert wesentlich schneller.

Das mit 



import decimal


kannte ich auch noch nicht.

0

Wie bei allen Sprachen gibt es 2 grobe Wege:

a) Strings {Texte}

b) Arrays {Felder aus Ganzzahlen wie Byte oder Integer}

Vorsicht mit dem Wort "unendlich"! Du hast doch nicht mal 32 GB RAM und selbst mit HD-Auslagerung kommst Du höchstens beim Speichern auf 1 TB Daten.

Mit dieser langsamen Sprache wirst Du zu Lebzeiten nicht mal 1 Mrd Stellen schaffen!

Mit c++ optimierten Maschinencode schafft ein i7 die 1 Mrd. Stellen in etwa 4 min.

Wie man die n. Wurzel berechnet, zeigt der Iterationsrechner

http://www.lamprechts.de/gerd/Roemisch_JAVA.htm

 im Beispiel 15. Einige sagen Heron... andere Newton-Iteration...

Jede Berechnung von irrationalen Zahlen ist IMMER näherungsweise! Man muss zwingend die Anzahl der Nachkommastellen als Abbruchbedingung angeben.

Also gebe erst mal Deine Prioritäten an (Geschwindigkeit, maximale Stellen-Anzahl, Vorgabe der Sprache) -> dann fallen viele Wege automatisch weg.


SwaghafterLEL 
Beitragsersteller
 13.12.2016, 23:43

aber wie funktioniert das prinzip, der micropozessor hat einen datenbus von 64 bit, wie kann er dann größere zahlen als 2^64 berechnen oder ganz genaue zahlen mit mehreren nachkommastellen, und wie funktioniert das prinzip zu berechnung von x nachkommastellen von irrationalen zahlen, ohne bibliotheken etc. einzubeziehen, weil sonst würde ich das prinzip nicht verstehen.

1
hypergerd  14.12.2016, 09:59
@SwaghafterLEL

Das Prinzip ist das, dass man die Grundrechenarten in Funktionen packt und als Übergabeparameter entweder

a) Strings { wie bei php }

b) Integer-Arrays nutzt

Jeder nackte Win-PC hat z.B. BAT Scriptsprache aus der 16-Bit-Welt

http://pastebin.com/cd5LLJr9

zeigt, wie man selbst mit so kleinen Integer-Zahlen die Grundrechenarten realisiert: Blöcke von 10000er zusammenpackt

Analog zum Schriftlichen Rechnen.

Der dahinterstehende Algorithmus bei diesem Beispiel ist Punkt 1

http://www.lamprechts.de/gerd/Kreiszahl.htm

also atan(x)

Obwohl call :PiEngine 16 5 -4 239

nur Summen aus 2 Teilsummen ist, wird

call :PiEngine 176 57 28 239 -48 682 96 12943

die 4er Summe noch schneller, da der kleinste Divisor die Konvergenzgeschwindigkeit bestimmt.

Unter §2f kann man sich ein c Programm aus nur 138 Byte ansehen, welches 15000 Stellen berechnen kann. Auch dort werden mit %04d 4er Blöcke gebildet.

Referenz für alle anderen ist §2c, welches vom Weltmeister hoch optimiert wurde: http://www.numberworld.org/y-cruncher/#Download

schafft mit i7 CPU 1 Mrd. Stellen in etwa 4 min!!

(da haben fast alle anderen Sprachen nicht mal 10000 Stellen geschafft)

Dort rechnet er alles mit hexadezimalen Zahlen, multipliziert mit der FFT-Methode auf alles logischen Kernen parallel und erst am Ende wird alles in dezimal umgerechnet.

1

In endlicher Zeit kannst du offensichtlich nicht unendlich viele Nachkommastellen berechnen.