2017-01-09 18 views
10

Zrobiłem program Python 3, aby obliczyć pi dla projektu szkolnego, ale zawsze kończy się on z 16 miejscami po przecinku. Czy istnieje limit długości liczb w pythonie? Jeśli jest taki język, z którego mógłbym skorzystać, to pozwoli mi kontynuować?Czy w pythonie występują ograniczenia liczby?

accuracy = int(input("accuracy: ")) 

current = 2 
opperation = "+" 
number = 3 
count = 1 

for i in range (accuracy): 
    if opperation == "-": 
     number = number - (4/(current*(current+1)*(current+2))) 
     opperation = "+" 
    elif opperation == "+": 
     number = number + (4/(current*(current+1)*(current+2))) 
     opperation = "-" 
    current += 2 
    print(str(count).zfill(8)) + ": " + str(number) 
    count += 1 
+2

Użyj modułu "dziesiętny", aby uniknąć ograniczeń długości i, co ważne dla twojego przypadku, aby uniknąć niedokładności zmiennoprzecinkowej. –

+0

Istnieje granica precyzji, którą można uzyskać za pomocą liczby zmiennoprzecinkowej o danym rozmiarze. Ale Python pozwoli ci pokazać więcej cyfr: 'from math import pi; print (format (pi, ".32f")) '. – jonrsharpe

+0

Jeśli chcesz wiedzieć dokładnie, jakie są specyfikacje dla elementów pływających w systemie, 'import sys; print (sys.float_info) ' –

Odpowiedz

9

Nie ma żadnych ograniczeń, jeśli pracujesz z liczbami całkowitymi i Python 3.x. Precyzja, jaką uzyskuje się za pomocą liczb zmiennoprzecinkowych jest jednak ograniczona. Python float (jak 3.14) jest naprawdę C double, który ma około 16 dziesiętnych dokładności, jak mówisz.

Możesz użyć modułu decimal do tworzenia i pracy z innymi liczbami zmiennoprzecinkowymi z dowolną precyzją. Przykładowy kod:

# Normal Python floats 
a = 0.000000000000000000001 
b = 1 + 2*a 
print(b) # Prints 1.0 

# Using Decimal 
import decimal 
decimal.getcontext().prec = 100 # Set the precision 
a = decimal.Decimal('0.000000000000000000001') 
b = 1 + 2*a 
print(b) # Prints 1.000000000000000000002 

Zobacz the docs więcej informacji na temat decimal.

+0

Pamiętaj, że używanie dziesiętnych będzie wolniejsze niż w przypadku budowania -w liczbach zmiennoprzecinkowych. – Richard

+2

@Richard Rzeczywiście. Chociaż w Pythonie 3.3 moduł "dziesiętny" został [przyspieszony] (https://docs.python.org/3/whatsnew/3.3.html#new-dimal) o czynnik ~ 100! W przypadku nowszych wersji Pythona nie powinno to być problematycznie wolne. –

+0

Myślę, że warto zauważyć, że w dokumentacji modułu dziesiętnego istnieje przepis na obliczenie pi – Copperfield