2016-02-24 13 views
15

Đây hầu hết là một câu hỏi hết sức tò mò. Tôi nhận thấy rằng bộ thử nghiệm khó khăn contains tests for 128 bit integersnumerictypes module đề cập đến int128, float256 (octuple precision?) Và các loại khác dường như không ánh xạ tới dtypes cứng nhắc trên máy của tôi.Numpy octuple float chính xác và 128 bit ints. Lý do tại sao và làm thế nào?

Máy của tôi là 64 bit, nhưng tôi có thể sử dụng bốn lần 128 bit nổi (but not really). Tôi giả sử rằng nếu nó có thể mô phỏng nổi bốn lần trong phần mềm, người ta cũng có thể giả lập cũng mô phỏng nổi octuple và 128bit ints. Mặt khác, cho đến bây giờ tôi chưa bao giờ nghe nói về 128 bit int hoặc octuple điểm nổi chính xác trước đây. Tại sao có tham chiếu đến 128bit ints và 256 bit nổi trong mô-đun numerictypes của numpy nếu không có dtype s tương ứng và cách tôi có thể sử dụng chúng?

+0

Tôi đoán bạn có thể làm việc ra bất kỳ '32 * n' hoặc '64 * n' chính xác về mặt lý thuyết, nhưng tôi phải nói rằng về những loại được thực hiện chỉ trong các thử nghiệm là hấp dẫn. –

+3

Hãy nhớ rằng một 'np.float128' thường không có 128 bit chính xác - nó tương đương với một C' long double', thường có 80 bit trên x86 ([xem tại đây] (http: // stackoverflow. com/q/9062562/1461210)). –

+0

@ali_m Tôi hiểu rồi. Tôi đã học được điều gì đó mới mẻ hôm nay! – gerrit

Trả lời

3

Đây là một câu hỏi rất thú vị và có lẽ có những lý do liên quan đến python, đến tính toán và/hoặc phần cứng. Trong khi không cố gắng đưa ra câu trả lời đầy đủ, đây là những gì tôi sẽ hướng tới ...

Lưu ý đầu tiên rằng các loại được xác định bởi ngôn ngữ và có thể khác với kiến ​​trúc phần cứng của bạn. Ví dụ, bạn thậm chí có thể tăng gấp đôi với bộ xử lý 8 bit. Tất nhiên bất kỳ số học nào liên quan đến nhiều lệnh CPU, làm cho việc tính toán chậm hơn nhiều. Tuy nhiên, nếu ứng dụng của bạn yêu cầu nó, nó có thể là giá trị hoặc thậm chí cần thiết (tốt hơn là muộn hơn sai, đặc biệt nếu nói rằng bạn đang chạy một mô phỏng cho một sự ổn định cầu nói ...) Vì vậy, nơi là 128bit chính xác yêu cầu? Đây là wikipedia article trên đó ...

Một chi tiết thú vị khác là khi chúng tôi nói một máy tính được nói 64 bit, đây không phải là mô tả đầy đủ phần cứng. Có rất nhiều phần có thể (và ít nhất là đôi khi) các bit khác nhau: Các thanh ghi tính toán trong CPU, thanh ghi địa chỉ/bộ nhớ địa chỉ bộ nhớ và các bus khác nhau quan trọng nhất từ ​​CPU đến bộ nhớ.

-ALU (đơn vị số học và logic) có các thanh ghi có tính toán. Máy của bạn là 64bit (không chắc chắn nếu điều đó cũng có nghĩa là họ có thể thực hiện 2 phép tính 32 bit tại một thời điểm tương tự) Đây rõ ràng là số lượng phù hợp nhất cho cuộc thảo luận này. Thời gian dài trước đây, nó đã từng là trường hợp bạn có thể ra ngoài và mua co-processor để tăng tốc độ cho các phép tính có độ chính xác cao hơn ...

-Các Đăng ký giữ địa chỉ bộ nhớ hạn chế bộ nhớ máy tính có thể nhìn thấy (trực tiếp) đó là lý do tại sao các máy tính có đăng ký bộ nhớ 32 bit chỉ có thể nhìn thấy 2^32 byte (hoặc xấp xỉ 4 GB) Chú ý rằng đối với 16bits, điều này trở thành 65K rất thấp. Các hệ điều hành có thể tìm cách xung quanh giới hạn này, nhưng không phải cho một chương trình duy nhất, do đó, không có chương trình trong một máy tính 32bit bình thường có thể có hơn 4GB memmory.

-Thông báo rằng các giới hạn đó là về byte chứ không phải bit. Đó là bởi vì khi giới thiệu và tải từ bộ nhớ, chúng tôi tải byte. Trong thực tế, cách này được thực hiện, tải một byte (8 bit) hoặc 8 (64 bit == buss chiều dài cho máy tính của bạn) mất cùng một lúc. Tôi yêu cầu một địa chỉ, và sau đó nhận được cùng một lúc tất cả các bit thông qua xe buýt. Có thể là trong một kiến ​​trúc, tất cả các đại lượng này không cùng số bit.

-1

NumPy cực kỳ mạnh mẽ và có thể xử lý số lớn hơn nhiều so với biểu diễn CPU bên trong (ví dụ: 64 bit).

Trong trường hợp loại động, lưu trữ số trong một mảng. Nó có thể mở rộng khối bộ nhớ quá, đó là lý do tại sao bạn có thể có một số nguyên với 500 chữ số. Loại động này được gọi là bignum. Trong các phiên bản Python cũ, nó là loại dài. Trong Python mới hơn (3.0+) chỉ có thời gian dài, được gọi là int, hỗ trợ gần như tùy ý số chữ số (-> bignum).

Nếu bạn chỉ định loại dữ liệu (ví dụ int32), thì bạn chỉ định định dạng bit và chiều dài bit, tức là các bit trong bộ nhớ là viết tắt của cái gì. Ví dụ:

dt = np.dtype(np.int32)  # 32-bit integer 
dt = np.dtype(np.complex128) # 128-bit complex floating-point number 

Look in: https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

+1

128bit số phức tạp là bình thường đôi chính xác – gerrit

+2

float32 là duy nhất, float64 là đôi, float96 mở rộng, float128 mở rộng chính xác nổi. số phức có hai thành phần, tức là nửa chiều rộng mỗi thành phần: complex64 là đơn, phức tạp128 là phức hợp hai độ chính xác. – Ralf

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