Tôi đang tìm kiếm một thư viện toán học chính xác tùy ý tốt trong C hoặc C ++. Bạn có thể vui lòng cho tôi một số lời khuyên hoặc đề xuất?
Các yêu cầu chính:
Nó phải xử lý các số nguyên lớn tùy ý — mối quan tâm chính của tôi là trên các số nguyên. Trong trường hợp bạn không biết từ lớn có nghĩa là gì, hãy tưởng tượng một cái gì đó giống như 100000! (giai thừa của 100000).
Độ chính xác không cần phải được chỉ định trong quá trình khởi tạo thư viện hoặc tạo đối tượng. Độ chính xác chỉ nên bị hạn chế bởi các tài nguyên có sẵn của hệ thống.
Nó sẽ sử dụng toàn bộ sức mạnh của nền tảng và nên xử lý các số lượng "nhỏ" một cách nguyên bản. Điều đó có nghĩa là trên nền tảng 64 bit, việc tính toán (2 ^ 33 + 2 ^ 32) nên sử dụng các hướng dẫn sẵn có của CPU 64 bit. Thư viện không nên tính toán điều này theo cách tương tự như nó làm với (2 ^ 66 + 2 ^ 65) trên cùng một nền tảng.
Nó phải xử lý hiệu quả các phép tính cộng (
+
), trừ (-
), nhân (*
), chia số nguyên (/
), phần dư%
(**
), lũy thừa ( ), tăng (++
), giảm (--
), GCD, giai thừa và các phép tính số học số nguyên phổ biến khác. Khả năng xử lý các hàm như căn bậc hai và logarit không tạo ra kết quả số nguyên là một điểm cộng. Khả năng xử lý các phép tính tượng trưng thậm chí còn tốt hơn.
Đây là những gì tôi tìm thấy cho đến nay:
Lớp BigInteger và BigDecimal của Java : Tôi đã sử dụng chúng cho đến nay. Tôi đã đọc mã nguồn, nhưng tôi không hiểu toán học bên dưới. Nó có thể dựa trên những lý thuyết và thuật toán mà tôi chưa từng học.
Kiểu số nguyên tích hợp sẵn hoặc trong các thư viện lõi của bc , Python , Ruby , Haskell , Lisp , Erlang , OCaml , PHP , một số ngôn ngữ khác: Tôi đã sử dụng một số ngôn ngữ này, nhưng tôi không biết họ đang sử dụng thư viện nào, hoặc họ đang sử dụng loại triển khai nào.
Những gì tôi đã biết:
Sử dụng
char
cho các chữ số thập phân vàchar*
cho các chuỗi thập phân, và thực hiện các phép tính trên các chữ số bằng cách sử dụng dấufor
-loop.Sử dụng
int
(hoặclong int
, hoặclong long
) làm “đơn vị” cơ bản và một mảng thuộc loại đó dưới dạng số nguyên dài tùy ý và thực hiện các phép tính trên các phần tử bằng cách sử dụngfor
-loop.Sử dụng kiểu số nguyên để lưu trữ một chữ số thập phân (hoặc một vài chữ số) dưới dạng BCD (Số thập phân được mã hóa nhị phân) .
Những gì tôi không biết:
- In mảng nhị phân được đề cập ở trên dưới dạng thập phân mà không sử dụng các phương pháp ngây thơ. Một ví dụ về phương pháp ngây thơ: (1) cộng các bit từ thấp nhất đến cao nhất: 1, 2, 4, 8, 16, 32,… (2) sử dụng chuỗi a
char*
đã đề cập ở trên để lưu trữ các kết quả thập phân trung gian).
Điều tôi đánh giá cao:
So sánh tốt về GMP , MPFR , decNumber (hoặc các thư viện khác tốt theo ý kiến của bạn).
Những gợi ý hay về những cuốn sách và bài báo mà tôi nên đọc. Ví dụ: một minh họa với các số liệu về cách hoạt động của thuật toán chuyển đổi nhị phân sang thập phân không ngây thơ sẽ rất tốt. Bài báo “ Chuyển đổi từ nhị phân sang thập phân trong độ chính xác có hạn ” của Douglas W. Jones là một ví dụ về một bài báo hay.
Mọi sự giúp đỡ nói chung.
Vui lòng không trả lời câu hỏi này nếu bạn nghĩ rằng việc sử dụng double
(hoặc long double
, hoặc long long double
) có thể giải quyết vấn đề này một cách dễ dàng. Nếu bạn nghĩ như vậy, bạn không hiểu vấn đề được đề cập.