2012-01-30 40 views
19

Bản đồ numpy.float128 có độ chính xác đến mức nào? Có __float128 hoặc dài gấp đôi? (hoặc cái gì khác hoàn toàn !?)Độ chính xác nội bộ của numpy.float128 là gì?

Tiềm năng theo dõi nếu có ai biết: có an toàn trong C để đúc __float128 thành một (16 byte) dài gấp đôi, chỉ mất độ chính xác không? (điều này là để giao tiếp với một lib lib hoạt động trên đôi dài).

Chỉnh sửa: Để trả lời nhận xét, nền tảng là 'Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric'. Bây giờ, nếu numpy.float128 có độ chính xác khác nhau phụ thuộc vào nền tảng, đó cũng là kiến ​​thức hữu ích cho tôi!

Chỉ cần rõ ràng, đó là độ chính xác Tôi quan tâm, không phải kích thước của một phần tử.

+0

"Các phiên bản có số sau tương ứng với bất kỳ từ nào có sẵn trên nền tảng cụ thể mà bạn đang sử dụng có ít nhất nhiều bit trong chúng". 128 bit. Điều gì đã gây nhầm lẫn về điều đó? Đó là nền tảng cụ thể và bạn đã không liệt kê một nền tảng, làm cho nó không thể trả lời câu hỏi của bạn như được yêu cầu. Vui lòng ** cập nhật ** câu hỏi với thông tin nền tảng Python chính xác. Gợi ý: có một gói 'platform'. –

+1

"có vẻ rõ ràng" - giả sử nó cũng nói điều gì xảy ra khi không có loại như vậy có sẵn trên nền tảng cụ thể. –

+3

Tôi đã giả định rằng độ chính xác cao là nền tảng độc lập, vì vậy thông tin ngược lại chắc chắn là hữu ích. I * sẽ * giả định rằng float128 ánh xạ tới một cái gì đó như __float128 trong nội bộ, nhưng đôi dài cũng là 128 bit trên hệ thống của tôi, vì vậy nó có thể hợp lý được điều đó. –

Trả lời

7

Bạn nên sử dụng longdouble instead of float128 vì nó khá là a mess, ATM. Python sẽ cast nó vào float64 trong quá trình khởi tạo.

Bên trong gumpy, nó có thể là đôi hoặc dài gấp đôi. Nó được xác định trong npy_common.h và phụ thuộc vào nền tảng của bạn. Tôi không biết liệu bạn có thể đưa nó vào trong mã nguồn của bạn hay không.

Nếu bạn không cần hiệu suất trong phần này của thuật toán, cách an toàn hơn có thể là xuất nó thành chuỗi và sử dụng strold sau đó.

+1

Liệu nó nằm chính xác trong bộ nhớ để đúc một con trỏ đến một mảng float128 dài gấp đôi? Nó là * hiệu suất quan trọng;) –

+1

Hơn nữa, đọc npy_common.h, nó có vẻ ngụ ý nó nhạy cảm với chiều dài phụ thuộc nền tảng dài gấp đôi (tức là nó sử dụng dài gấp đôi nếu dài gấp đôi là 128 bit), nhưng tâm trí của tôi C tiền xử lý là một chút flakey. –

+0

Ok, tôi đã trả lời phần lớn những câu hỏi mà tôi nghĩ. I * có thể * cast thành long double và mọi thứ hoạt động như mong đợi. Các tham chiếu ở trên sẽ gợi ý rằng float128, nếu nó tồn tại, được định nghĩa là một double dài, nhưng tôi không chắc chắn về điều này. –

32

numpy.longdouble dùng để chỉ loại trình biên dịch C của bạn gọi long double. Hiện tại, đây là loại chỉ loại điểm nổi chính xác mở rộng hỗ trợ gọn gàng.

Trên x86-32 và x86-64, đây là 80-bit floating point type. Trên các hệ thống kỳ lạ hơn nó có thể là một cái gì đó khác (IIRC trên Sparc đó là một thực tế 128-bit IEEE float, và trên PPC nó là double-double). (Nó cũng có thể phụ thuộc vào hệ điều hành và trình biên dịch bạn đang sử dụng - ví dụ: MSVC trên Windows không hỗ trợ bất kỳ loại độ chính xác mở rộng nào cả.)

Numpy cũng sẽ xuất một số tên như numpy.float96 hoặc numpy.float128. Tên nào trong số những tên này được xuất khẩu tùy thuộc vào nền tảng/trình biên dịch của bạn, nhưng bất cứ điều gì bạn nhận được luôn luôn đề cập đến cùng loại cơ bản là longdouble. Ngoài ra, những cái tên này rất gây hiểu lầm. Họ không cho biết định dạng điểm nổi động 96 hoặc 128 bit. Thay vào đó, chúng biểu thị số bit của căn chỉnh được sử dụng bởi loại cơ bản long double. Vì vậy, ví dụ: trên x86-32, long double là 80 bit, nhưng được đệm lên đến 96 bit để duy trì sự liên kết 32 bit và các cuộc gọi khó khăn này float96. Trên x86-64, long double lại là kiểu 80 bit giống hệt nhau, nhưng bây giờ nó được đệm lên tới 128 bit để duy trì sự liên kết 64 bit, và các cuộc gọi gumpy này là float128. Không có thêm độ chính xác, chỉ cần thêm đệm.

Đề xuất: bỏ qua các tên float96/float128, chỉ cần sử dụng numpy.longdouble. Hoặc tốt hơn nhưng dính vào gấp đôi trừ khi bạn có một lý do thực sự hấp dẫn. Chúng sẽ nhanh hơn, di động hơn, v.v.

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