2015-01-22 33 views
6

Chương trình của tôi tính toán hằng số toán học e, điều này là không hợp lý. Để làm được điều này, tôi cần phải có giai thừa về số lượng rất lớn.Số lượng lớn nhất mà lớp Thập phân có thể xử lý là gì?

int không thể xử lý số lớn hơn 170 !. (Tôi thấy rằng máy tính lớn nhất của Google có thể xử lý là 170.654259, nhưng tôi không chắc làm thế nào một số nguyên không có thể được nhân lên.) float cũng không thể xử lý các số rất lớn.

Tôi đã tính e đến 750000 chữ số và math.factorial(750000) là số lượng lớn. Tuy nhiên, Decimal xử lý nó dễ dàng.

Số lượng lớn có thể Decimal xử lý trước khi số OverflowError được nâng lên? Là kích thước khác nhau trong Python 2 so với Python 3?

+5

'Thập phân' không thực sự mang lại cho bạn câu trả lời chính xác. –

+1

Các số nguyên có độ chính xác vô hạn trong Python, ví dụ: 'math.thừa (170) 'là '7257415615307998967396728211129263114716991681296451376543577798900561843401706157852350749242617459511490991237838520776666022565442753025328900773207510902400430280058295603966612599658257104398558294257568966313439612262571094946806711205568880457193340212661452800000000000000000000000000000000000000000'. Xem [cách bạn có thể sử dụng 'decimal.Decimal' để tính toán câu trả lời với độ chính xác tùy ý (nhưng cố định)] (http://stackoverflow.com/a/347749/4279) – jfs

+0

FWIW, không khó để tính toán số lượng lớn chữ số thập phân của e sử dụng số học số nguyên. Xem [ở đây] (http://forums.xkcd.com/viewtopic.php?t=14661&p=3066871#p3066964) ví dụ mã bằng Python và C. –

Trả lời

6

Số thập phân lớn nhất có thể xử lý là gì?

Độ lớn lớn nhất là vô cực:

>>> from decimal import Decimal 
>>> Decimal('Inf') 
Decimal('Infinity') 

Các số hữu hạn biểu diễn lớn nhất trên một nền tảng cho phụ thuộc vào decimal.MAX_EMAX:

>>> from decimal import Context, MAX_EMAX 
>>> d = Context(Emax=MAX_EMAX, prec=1).create_decimal('9e'+str(MAX_EMAX)) 
>>> d.is_finite() 
True 
>>> d.next_plus() 
Decimal('Infinity') 
>>> d 
Decimal('9E+999999999999999999') 

Số lượng đáng kể chữ số phụ thuộc vào decimal.MAX_PREC ví dụ, để tính e với độ chính xác đã cho:

>>> from decimal import Context 
>>> Context(prec=60).exp(1) 
Decimal('2.71828182845904523536028747135266249775724709369995957496697') 

Hằng số (MAX_EMAX, MAX_PREC) chỉ liên quan đến việc triển khai C. Phiên bản Python thuần túy có thể sử dụng các giá trị lớn hơn:

>>> from decimal import Context, MAX_EMAX 
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: valid range for Emax is [0, MAX_EMAX] 
>>> from _pydecimal import Context, MAX_EMAX 
>>> Context(Emax=MAX_EMAX+1, prec=1).create_decimal('9e'+str(MAX_EMAX+1)) 
Decimal('9E+1000000000000000000') 
1

Tùy thuộc vào ngữ cảnh bạn cung cấp cho đối tượng thập phân. Từ library documentation:

lớp decimal.Context (prec = Không, làm tròn = None, bẫy = None, cờ = None, Emin = None, Emax = None, thủ đô = 1)

EmaxEmin kiểm soát giới hạn của số thập phân của bạn. Nếu số mũ lớn hơn Emax hoặc nhỏ hơn Emin, sẽ có tín hiệu tràn. Bạn có thể xem các trường trong decimal.defaultContext để xem chúng là gì theo mặc định hoặc decimal.getContext() để xem chúng ở bất kỳ thời điểm nào.

Chỉnh sửa: Vì @davidism đã chỉ ra rằng bạn không nhận được câu trả lời chính xác từ các tính toán decimal. Độ chính xác mặc định của mô-đun là 28. Vì vậy, tất cả các số nguyên lên đến 999999999999999999999999999999 (28 nines) có thể được biểu diễn chính xác và số cao hơn có thể được làm tròn.

+0

Chỉ sau đó nó sẽ làm tăng lỗi tràn? Khi tôi tính toán e, quạt máy tính của tôi to và màn hình hệ thống hiển thị rằng một trong các CPU của tôi đang ở mức sử dụng 100% và chúng sẽ chuyển đổi sau mỗi 15 phút. Điều gì sẽ xảy ra nếu máy tính của tôi có nhiệm vụ hướng dẫn chuyên sâu khiến nó đạt đến nhiệt độ tối đa? Hoặc nếu số được lưu trong RAM và RAM sẽ hết dung lượng thì sao? –

+0

không đủ bộ nhớ sẽ cho 'MemoryError'. quá nóng không phải là một cái gì đó mà sẽ cung cấp cho bất kỳ tín hiệu trong python như xa như tôi biết. – M4rtini

+1

trường 'bẫy' xác định những thứ sẽ gây ra lỗi và những thứ gì sẽ quét dưới tấm thảm. Theo mặc định tràn được coi là lỗi. Tôi thực sự không thể nói cho bạn biết số lượng python quan tâm đến giới hạn vật lý của máy tính của bạn. Nhưng nếu bạn không quan tâm quá nhiều về dữ liệu của bạn, tôi khuyến khích bạn chạy một số thử nghiệm. – genisage

Các vấn đề liên quan