2008-11-10 40 views
18

Thư viện nào dành cho Java ở đó có triển khai nhanh cho các hoạt động điểm động hoặc điểm cố định với độ chính xác vài nghìn chữ số? Họ biểu diễn như thế nào?Thư viện có độ chính xác cao điểm nổi Java

Một yêu cầu đối với tôi là nó thực hiện thuật toán nhân tốt hơn thuật toán nhân giống ngây thơ, mất gấp 4 lần số chữ số lớn hơn 2 lần (so sánh Multiplication algorithms).

+0

Câu hỏi chung từ quan điểm ưa thích ... ứng dụng của bạn yêu cầu hàng nghìn chữ số thập phân chính xác là gì? – Simon

+1

Đây là một sở thích, không phải là công việc: Tôi muốn tính thêm một số chữ số của http://en.wikipedia.org/wiki/Feigenbaum_constant –

Trả lời

35

Có ba thư viện được đề cập trên trang Arbitrary Precision Arithmetic: java.math (có chứa BigDecimal được đề cập), ApfloatJScience. Tôi chạy một kiểm tra tốc độ nhỏ trên chúng chỉ sử dụng phép cộng và phép nhân.

Kết quả là đối với số lượng chữ số tương đối nhỏ BigDecimal là OK (nhanh bằng một nửa số khác), nhưng nếu bạn sử dụng nhiều chữ số hơn, JScience nhanh gấp 4 lần. Nhưng người chiến thắng hiệu suất rõ ràng là Apfloat. Các thư viện khác dường như sử dụng các thuật toán nhân bản ngây thơ mà mất thời gian tỷ lệ thuận với bình phương của số chữ số, nhưng thời gian Apfloat dường như phát triển gần như tuyến tính. Với 10000 chữ số nhanh gấp 4 lần JScience, nhưng trên 40000 chữ số nhanh gấp 16 lần JScience.

Mặt khác: JScience cung cấp chức năng EXCELLENT cho các vấn đề toán học: ma trận, vectơ, thuật toán tượng trưng, ​​giải pháp của hệ phương trình và những gì không. Vì vậy, tôi có thể sẽ đi với JScience và sau đó viết một wrapper để tích hợp Apfloat vào các thuật toán của JScience - do thiết kế tốt này có vẻ dễ dàng có thể.

(UPDATE: Tôi đã viết một bộ kiểm tra cho gói số JScience và cố định một số lỗi này đi vào phát hành 4.3.1 Vì vậy, tôi có thể đề nghị kiểm tra nó ra...)

+2

Một số thư viện có hỗ trợ hàm lượng giác không? –

+0

Bạn đang nói JScience duy trì một lợi thế tốc độ ~ 4x liên tục khi bạn đi qua một ngưỡng nhất định của chữ số? Hay sự khác biệt về tốc độ có được rõ rệt hơn cho nhiều chữ số hơn không? –

+0

@Asad Tôi đã không thực hiện các thí nghiệm chi tiết như vậy, nhưng tôi đoán họ sử dụng các thuật toán khác nhau với các độ phức tạp về thời gian khác nhau. (Ít nhất là để nhân và vv.) Vì vậy, sự khác biệt tốc độ sẽ nhận được lớn hơn và lớn hơn các chữ số hơn bạn có. Nhưng nếu bạn muốn nhiều chữ số hơn, bạn cần phải làm thí nghiệm của riêng bạn, và có lẽ thậm chí còn có các thư viện tốt hơn cho điều đó. –

5

Bạn đã kiểm tra hiệu suất của BigDecimal chưa? Tôi không thể nhìn thấy bất cứ điều gì rõ ràng trong JavaDoc, nhưng nó chắc chắn sẽ là cổng gọi đầu tiên của tôi.

+1

Với độ chính xác rất cao, điều này sẽ chậm hơn nhiều. Tôi chỉ đề nghị điều này nếu bạn chỉ có hàng chục chữ số hoặc không quan tâm đến tốc độ. –

+0

@hstoerr: Thật tốt khi bạn kiểm tra nó - nhưng tôi nghĩ cách tiếp cận "thử nghiệm điều đơn giản nhất sẽ hoạt động" (nơi được xây dựng là một lợi thế điểm khởi đầu đáng kể) vẫn là bước khởi đầu tốt :) –

+0

BigDecimal là khá hạn chế, ví dụ nó không hỗ trợ sqrt trái ngược với JScience – Tomasz

2

Bạn có thể xem thư viện JScience và lớp số Real của chúng. Tôi không chắc làm thế nào hiệu suất là tương đối so với BigDecimal, nhưng mục tiêu của thư viện là cung cấp các lớp học được điều chỉnh cao cho các ứng dụng khoa học, mà có vẻ như là một dấu hiệu tốt.

-3

Apfloat cung cấp chính xác cao trên mantissa, nhưng dường như cho độ chính xác ít hơn bình thường trên số mũ (dựa trên thực tế là nó treo với "Logarithm của số không" cho các giá trị mà đôi có thể xử lý). Vì vậy, nó không phải là hữu ích cho số lượng lớn.

Ngoài ra, các tài liệu hướng dẫn nói:

"Một cái bẫy tồn tại với các nhà thầu Apfloat (float, long) và Apfloat (double, long) Kể từ khi nổi và đôi luôn thể hiện trong nội bộ trong cơ số 2, chuyển đổi sang. bất kỳ cơ số nào khác thường gây ra lỗi vòng tròn và kết quả là apfloat sẽ không chính xác với số chữ số mong muốn. Apfloat mới (0.3f, 1000), số kết quả sẽ không chính xác đến 1000 chữ số, nhưng chỉ khoảng 7 chữ số (trong cơ số 10). Trên thực tế, số kết quả sẽ là 0,330001192092896 ... "

Điều này dường như làm cho Apfloat hữu ích tối thiểu.

BigDecimal không có chức năng lôgarit và tài liệu không cho biết liệu nó có cho phép bạn tạo số lớn hơn gấp đôi hay không; số mũ là 32 bit, loại.

+1

Thực ra Phil, lý do cho sự đổ vỡ đó là bởi vì bạn đang xây dựng Apfloat với một phao hoặc gấp đôi. Sự thiếu chính xác là bởi vì bạn đang chuyển cho nó một con số không chính xác. Nếu bạn dành thời gian để đọc đoạn tiếp theo, bạn sẽ thấy rằng nếu bạn xây dựng nó bằng một chuỗi bạn có thể có độ chính xác vô hạn. – Snickers

+0

BigDecimal 0,3 sẽ chính xác. Để lấy ví dụ đó. Apfloat có một hàm tạo từ BigDecimal không? BigDecimal là loại lai trong biểu diễn, phần định trị là cơ sở 2 (BigInteger), nhưng số mũ là cơ số 10. –

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