2013-06-21 49 views
5

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”?

+1

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'. –

+1

@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. –

+1

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ở. –

Trả lời

6

Khi bạn có số phụ bất thường và có nghĩa là lẻ, nghĩa là số lẻ 2^(-1074), bạn có số có chữ số không phải cuối cùng trong biểu diễn thập phân là 1074 thứ sau dấu thập phân. Sau đó, bạn có khoảng 300 số không trực tiếp theo dấu thập phân, vì vậy số có khoảng 750-770 chữ số thập phân đáng kể. Nhỏ nhất tích cực nhỏ, 2^(-1074) có 751 chữ số có nghĩa, và số dương lớn nhất, (2^52-1)*2^(-1074) có 767 chữ số có nghĩa (tôi nghĩ đó là số tối đa).

Vì vậy, có ít nhất một chuỗi d1, ..., d766 chữ số thập phân như rằng có một IEEE754 double trong khoảng mở

(d1.d2...d766E-308, d1.d2...(d766 + 1)E-308) 

Câu trả lời không thay đổi nhiều nếu chúng ta xem xét "chứa các điểm giữa của hai liên tiếp IEEE754 double s ", vì subnormal double s có tất cả khoảng cùng số lượng chữ số thập phân quan trọng, và điểm giữa của hai liên tiếp như vậy quá.

Trong trường hợp xấu nhất, toàn bộ chuỗi chữ số phải được tiêu thụ (xem "0.5000000...0001" với nhiều số 0 tùy ý trước 1 cuối cùng xác định kết quả là 0.5 + 0.5^53 và không 0.5 khi làm tròn từ 0 trở lên).

Tuy nhiên, chỉ có

floor(DBL_MANT_DIG * log 2/log 10) + 2 = 17 

đáng kể chữ số thập phân cần thiết để phân biệt giữa double giá trị khác nhau, do đó, một tương đối dễ dàng, mặc dù có lẽ không phải là rất hiệu quả, phương pháp phân tích cú pháp sẽ được phân tích là người đầu tiên (ít nhất 17) chữ số (và số mũ) đến double gần nhất và so sánh chuỗi đầu vào với đại diện chính xác của giá trị double đó (và hàng xóm của nó).

+0

Cảm ơn câu trả lời của bạn. Số n tôi đã cố xác định là số chữ số thập phân phải được phân tích cú pháp ở chế độ bình thường trước khi an toàn để chuyển sang chế độ "dính". Trình tự thập phân dài tùy ý như 0.50000 ... 00001 có thể được xây dựng nhưng sau một thời gian nó chỉ quan trọng cho dù vẫn còn một số không khác hay không, và câu hỏi tôi muốn trả lời là “sau bao nhiêu chữ số, chính xác?”. Tôi vẫn cần phải suy nghĩ về sự khác biệt giữa các chế độ hướng đến và gần nhất, nhưng bạn đã giúp tôi rất nhiều. –

+1

Tôi không nghĩ rằng tôi mua lập luận của bạn rằng 17 chữ số là đủ. Nhìn vào 1 + 45/2^53 và 1 + 46/2^53. '1.00000000000000505' khoanh tròn nhưng' 1.000000000000005059' làm tròn lên. Sự khác biệt nằm ở vị trí thập phân 18. – tmyklebu

+1

@tmyklebu Không có IEEE754 'double' với giá trị '1 + 45/2^53'. Điều đó cần 54 bit chính xác để được thể hiện. Nhỏ hơn tiếp theo sau '1 + 46/2^53' là '1 + 44/2^53 = 1.000000000000004884981308350688777863979339599609375'. –

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