Decimal, math und Stellenanzahl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
PatrickF
User
Beiträge: 27
Registriert: Sonntag 1. Mai 2022, 09:43

Hallo zusammen,

mein Kampf um das Verständnis von Decimal geht weiter... :D

Inspiriert von folgender Seite
https://www.jpl.nasa.gov/edu/news/2016/3/16/how-many-decimals-of-pi-do-we-really-need/
habe ich folgendes Programm entworfen, um die im Artikel geschilderten Fakten für mich zu veranschaulichen.

Code: Alles auswählen

# https://www.jpl.nasa.gov/edu/news/2016/3/16/how-many-decimals-of-pi-do-we-really-need/

from scipy import constants
import math
from decimal import Decimal
from decimal import getcontext
getcontext().prec = 30

pi_100=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
pi_30=3.141592653589793238462643383279
radius_v=constants.astronomical_unit*156.21 # Voyager; Am 8. Mai 2022 ist Voyager 1 ca. 156,21 Astronomische Einheiten (AE) von der Sonne entfernt, das sind etwa 23,37 Milliarden Kilometer
radius_e=6378 #Erde
radius_1=1
radius_u=constants.light_year*4.6508*10**10 #Universe


for i in range(0,20):
    pi=round(math.pi,i)
    circle=radius_1*2*pi #Kreisumfang ->r²pi<-
    print("Pi",i,"Stellen = ",round(math.pi,i),"=",circle)

print()

for i in range(0,20):
    pi=round(pi_30,i)
    circle=radius_1*2*pi #Kreisumfang ->r²pi<-
    print("Pi",i,"Stellen = ",round(pi,i),"=",circle)
Ergebnis ist z.B. so (wenn ich testweise radius_1 nutze):
Pi 0 Stellen = 3.0 = 6.0
Pi 1 Stellen = 3.1 = 6.2
Pi 2 Stellen = 3.14 = 6.28
Pi 3 Stellen = 3.142 = 6.284
Pi 4 Stellen = 3.1416 = 6.2832
Pi 5 Stellen = 3.14159 = 6.28318
Pi 6 Stellen = 3.141593 = 6.283186
Pi 7 Stellen = 3.1415927 = 6.2831854
Pi 8 Stellen = 3.14159265 = 6.2831853
Pi 9 Stellen = 3.141592654 = 6.283185308
Pi 10 Stellen = 3.1415926536 = 6.2831853072
Pi 11 Stellen = 3.14159265359 = 6.28318530718
Pi 12 Stellen = 3.14159265359 = 6.28318530718
Pi 13 Stellen = 3.1415926535898 = 6.2831853071796
Pi 14 Stellen = 3.14159265358979 = 6.28318530717958
Pi 15 Stellen = 3.141592653589793 = 6.283185307179586
Pi 16 Stellen = 3.141592653589793 = 6.283185307179586
Pi 17 Stellen = 3.141592653589793 = 6.283185307179586
Pi 18 Stellen = 3.141592653589793 = 6.283185307179586
Pi 19 Stellen = 3.141592653589793 = 6.283185307179586

Pi 0 Stellen = 3.0 = 6.0
Pi 1 Stellen = 3.1 = 6.2
Pi 2 Stellen = 3.14 = 6.28
Pi 3 Stellen = 3.142 = 6.284
Pi 4 Stellen = 3.1416 = 6.2832
Pi 5 Stellen = 3.14159 = 6.28318
Pi 6 Stellen = 3.141593 = 6.283186
Pi 7 Stellen = 3.1415927 = 6.2831854
Pi 8 Stellen = 3.14159265 = 6.2831853
Pi 9 Stellen = 3.141592654 = 6.283185308
Pi 10 Stellen = 3.1415926536 = 6.2831853072
Pi 11 Stellen = 3.14159265359 = 6.28318530718
Pi 12 Stellen = 3.14159265359 = 6.28318530718
Pi 13 Stellen = 3.1415926535898 = 6.2831853071796
Pi 14 Stellen = 3.14159265358979 = 6.28318530717958
Pi 15 Stellen = 3.141592653589793 = 6.283185307179586
Pi 16 Stellen = 3.141592653589793 = 6.283185307179586
Pi 17 Stellen = 3.141592653589793 = 6.283185307179586
Pi 18 Stellen = 3.141592653589793 = 6.283185307179586
Pi 19 Stellen = 3.141592653589793 = 6.283185307179586
Ich schaff es jetzt einfach nicht, Decimal() so einzubinden, dass sich beim Ergebnis Pi ab der 15. Stelle nicht wiederholt. Math.pi erzeugt ja Pi mit 15 stellen, aber wie komme ich an mehr?

Mein Ansatz zum testen:

Code: Alles auswählen

from decimal import Decimal
from decimal import getcontext
#print(getcontext())
getcontext().prec = 30

pi_30=Decimal(3.141592653589793238462643383279)

print(round(Decimal(pi_30),20))
print(round(Decimal(pi_30),29))
print(Decimal(pi_30))
print(pi_30)

for i in range(0,20):
    pi=round(pi_30,i)
    print(i,"-",Decimal(pi))
Warum ergibt Decimal(pi_30) hier eine ziemlich andere Zahl als pi_30 selbst? (pi_30 = Pi mit 30 Stellen aus dem Web)

pi_30=3.141592653589793238462643383279

aber

Decimal(3.141592653589793238462643383279) = 3.141592653589793115997963468544185161590576171875

Stehe da etwas auf dem Schlauch....
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PatrickF: Dein `pi_30` und erst Recht `pi_100` kann so nicht funktionieren weil Du zwar im Quelltext beliebig viele Nachkommastellen hin schreiben kannst `float` die doch aber gar nicht speichern kann. Du musst aus so etwas gleich `Decimal`-Objekte machen.

Code: Alles auswählen

In [175]: 3.141592653589793238462643383279                                      
Out[175]: 3.141592653589793

In [176]: 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679                                      
Out[176]: 3.141592653589793
Führt beides zum gleichen Wert.

Du importierst zwar Kram aus `decimal` aber letztlich erzeugst Du nirgends ein `Decimal`-Objekt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PatrickF
User
Beiträge: 27
Registriert: Sonntag 1. Mai 2022, 09:43

Glaub ich hab den Fehler gefunden, hab wohl bei Decimal() die Hochkommata vergessen.

So scheint es zu klappen:

Code: Alles auswählen

from scipy import constants
# import math
from decimal import Decimal
from decimal import getcontext
getcontext().prec = 31

#pi_100=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
#pi_30=3.141592653589793238462643383279

pi_30=Decimal('3.141592653589793238462643383279')
radius_v=constants.astronomical_unit*156.21 # Voyager; Am 8. Mai 2022 ist Voyager 1 ca. 156,21 Astronomische Einheiten (AE) von der Sonne entfernt, das sind etwa 23,37 Milliarden Kilometer
radius_e=6378 #Erde
radius_1=1
radius_u=constants.light_year*4.6508*10**10 #Universe


for i in range(0,31):
    pi=round(pi_30,i)
    circle=radius_1*2*pi #Kreisumfang ->r²pi<-
    print("Pi",i,"Stellen = ",round(pi_30,i),"=",circle)
Danke dir jedenfalls für deinen Denkanstoß.
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Bei der vorletzten Zeile, Definition von `circle`, passen Code und Kommentar irgendwie nicht zusammen. Im Code wird mit 2 multipliziert, im Kommentar potenziert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PatrickF
User
Beiträge: 27
Registriert: Sonntag 1. Mai 2022, 09:43

Stimmt, muss natürlich

Code: Alles auswählen

r*2*pi 
heißen, mit Flächeninhalt verwechselt. :roll:
Antworten