Xem xét các biểu diễn thập phân của biểu mẫu d1.d2d3d4d5 ... dnExxx trong đó xxx là số mũ tùy ý và cả d1 và dn đều là nonzero.Số chữ số thập phân tối đa có thể ảnh hưởng đến một đôi
N tối đa được biết như vậy có tồn tại một đại diện thập phân d1.d2d3d4d5 ... dnExxx sao cho khoảng thời gian (d1.d2d3d4d5 ... dnExxx, d1.d2d3d4d5 ... ((dn) +1) Exxx) chứa IEEE 754 đôi?
n nên có ít nhất 17. Câu hỏi đặt ra là bao nhiêu trên 17.
Con số này n có cái gì để làm với số lượng chữ số mà nó là đủ để xem xét trong một chuyển đổi số thập phân-to-đôi như vậy là strtod()
. Tôi đã xem mã nguồn cho David M. Gay's implementation với hy vọng tìm thấy câu trả lời ở đó. Có một ám chỉ đến “40” nhưng không rõ liệu đây có phải là kết quả của một kết quả toán học âm thanh hay chỉ là một ràng buộc an toàn về mặt thống kê. Ngoài ra các bình luận về "cắt ngắn" làm cho nó âm thanh như 0.5000000000000000000000000000000000000000000000000001 có thể được chuyển đổi sang 0,5 trong chế độ tròn lên trên.
Musl's implementation dường như đã đọc khoảng 125 * 9 chữ số, rất nhiều. Sau đó, nó chuyển sang chế độ “dính”:
if (c!='0') x[KMAX-4] |= 1;
Cuối cùng, làm thế nào để thay đổi câu trả lời khi thay “chứa một IEEE 754 đôi” với “chứa các điểm giữa của hai liên tiếp IEEE 754 đôi”?
Tôi không chắc mình hiểu được vấn đề. Ví dụ, '2^(- 1074)' có 751 chữ số thập phân đáng kể, do đó có một biểu diễn thập phân 'd1.d2 ...d750E-324' thỏa mãn điều kiện (bạn có thể sử dụng lâu hơn, nhưng không nhiều). Nhưng bạn chỉ cần một số ít các chữ số này để xác định IEEE754 gần nhất 'double'. –
@DanielFischer Nhưng 2^(- 1074) không nằm trong khoảng thời gian độc quyền (d1.d2 ... d750E-324, d1.d2 ... (d750 + 1) E-324). Bằng cách này (d750 + 1) là một sự lạm dụng nhẹ của ký hiệu nếu d750 là “9”. Sự lạm dụng này cũng có trong câu hỏi của tôi nhưng thay thế (d1.d2 ... d750E-324, (d1.d2 ... d750E-324 + 1E-1074)) cũng gây nhầm lẫn. Tôi thậm chí có thể nhận được số mũ sai. –
Tôi đã sử dụng một chữ số nhỏ hơn biểu diễn chính xác, vì vậy nó ở trong khoảng thời gian mở. –