2011-08-22 39 views
17

Nhiều ngôn ngữ lập trình sử dụng các cặp đôi IEEE 754 cung cấp chức năng thư viện để chuyển đổi các cặp đôi thành chuỗi. Ví dụ: C có sprintf, C++ có stringstream, Java có Double.toString, v.v.Thuật toán để chuyển đổi một cặp đôi IEEE 754 thành chuỗi?

Nội bộ, các hàm này được triển khai như thế nào? Đó là, thuật toán nào họ đang sử dụng để chuyển đổi đôi thành một biểu diễn chuỗi, cho rằng chúng thường phải tuân theo các giới hạn chính xác do người lập trình lựa chọn?

Cảm ơn!

Trả lời

11

Mã được sử dụng bởi các môi trường phần mềm khác nhau để chuyển đổi số dấu chấm động để đại diện chuỗi thường được dựa trên những điều sau đây ấn phẩm (tác phẩm của Steele và White thường được trích dẫn thường xuyên):

Jerome T. Coonen. Hướng dẫn triển khai cho một tiêu chuẩn đề xuất cho số học dấu chấm động. Máy tính, Vol. 13, số 1, tháng 1 năm 1980, trang 68-79

Guy. L. Steele Jr. và J. L. White. Cách in chính xác các số dấu phẩy động. Trong Kỷ yếu Hội nghị ACM SIGPLAN '90 về thiết kế và thực hiện ngôn ngữ lập trình, các trang 112-126, White Plains, New York, tháng 6 năm 1990.

David M. Gay. Chuyển đổi nhị phân thập phân và thập phân nhị phân được làm tròn chính xác. Báo cáo kỹ thuật 90--10, AT & T Bell Laboraties Tháng Mười Một 1990.

Một số liên quan followup công việc:

Robert G. Burger và R. Kent Dybvig. In các số dấu phẩy động nhanh chóng và chính xác. Trong Kỷ yếu Hội nghị ACM SIGPLAN 1996 về thiết kế và triển khai ngôn ngữ lập trình, các trang 108-116, Philadelphia, PA, Hoa Kỳ, tháng 5 năm 1996

Guy L. Steele Jr. và Jon L. White. Retrospective: Cách in chính xác các số dấu phẩy động. Thông báo ACM SIGPLAN, Tập 39, Số 4, trang 372–389, tháng 4 năm 2004

Florian Loitsch. In các số dấu phẩy động nhanh chóng và chính xác bằng số nguyên. Trong Kỷ yếu Hội nghị ACM SIGPLAN 2010 về thiết kế và triển khai ngôn ngữ lập trình, các trang 233-243, Toronto, ON, Canada, tháng 6 năm 2010

+4

Một bài báo mới khác vào năm 2016: Andrysco, Marc, Ranjit Jhala, và Sorin Lerner. "In các số dấu phẩy động: một phương pháp nhanh hơn, luôn chính xác". ACM SIGPLAN Thông báo 51, không. 1 (2016): 555-567. – sffc

2

Đối với hầu hết các ngôn ngữ mẫu, bạn trích dẫn nguồn được tự do tư vấn trực tuyến khi chúng có sẵn trong nguồn mở.

Đối với Java, lớp java.lang.Double ủy quyền tác phẩm này cho sun.misc.FloatingDecimal. Kiểm tra constructor của nó và phương thức toJavaFormatString().

Đối với C, glibc luôn là một ví dụ tốt, và ở đó chúng tôi see rằng đầu ra dấu phẩy động nằm trong tệp nguồn riêng của nó.

13

Tôi tin rằng bạn đang tìm kiếm Printing Floating-Point Numbers Quickly and Accurately

tôi thấy rằng liên kết trên bài khác: here.

+1

Một đề xuất tốt IMO, nhưng (đáng buồn) hiếm khi được chọn. Đó là lý do tại sao 0.2999999999999999999566 và như vậy thường xuyên hiển thị và gây ra nhiều nhầm lẫn. – harold

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