2011-02-09 38 views
5

Có liên quan liên quan đến câu hỏi this, chính xác những gì đang xảy ra ở đây với định dạng số?Định dạng số nội bộ Mathematica và độ chính xác

In[1] := InputForm @ 3.12987*10^-270 
Out[1] := 3.12987`*^-270 

In[2] := InputForm @ 3.12987*10^-271 
Out[2] := 3.1298700000000003`*^-271 

Nếu bạn sử dụng *10.^ như số nhân sự chuyển tiếp là nơi bạn sẽ ngây thơ mong đợi nó sẽ:

In[3] := InputForm @ 3.12987*10.^-16 
Out[3] := 3.12987`*^-16 

In[4] := InputForm @ 3.12987*10.^-17 
Out[4] := 3.1298700000000004`*^-17 

trong khi *^ mất quá trình chuyển đổi một chút nữa, mặc dù nó là máy có độ chính xác bắt đầu bong ra:

In[5] := InputForm @ 3.12987*^-308 
Out[5] := 3.12987`*^-308 

In[6] := InputForm @ 3.12987*10.^-309 
Out[6] := 3.12987`15.954589770191008*^-309 

Các cơ sở bắt đầu tan rã chỉ sau nhiều

In[7] := InputForm @ 3.12987*^-595 
Out[7] := 3.12987`15.954589770191005*^-595 

In[8] := InputForm @ 3.12987*^-596 
Out[8] := 3.1298699999999999999999999999999999999999`15.954589770191005*^-596 

Tôi giả định rằng các chuyển tiếp này liên quan đến định dạng Mathematica giữ số của nó, nhưng có ai biết hay quan tâm đến nguy cơ một người được giáo dục đoán, làm cách nào?

Trả lời

8

Nếu tôi hiểu chính xác bạn đang tự hỏi khi nào thì InputForm sẽ hiển thị nhiều hơn 6 chữ số. Nếu vậy, nó xảy ra bất ngờ, bất cứ khi nào nhiều chữ số được yêu cầu để "tốt nhất" đại diện cho số lượng thu được sau khi đánh giá. Vì việc đánh giá liên quan đến phép nhân rõ ràng bằng 10^(một số quyền lực), và vì đầu vào thập phân không cần (và trong trường hợp này là không) có thể biểu diễn chính xác trong nhị phân, bạn có thể nhận được sự khác biệt nhỏ so với những gì bạn mong đợi.

In[26]:= Table[3.12987*10^-j, {j, 10, 25}] // InputForm 

Out[26]//InputForm= 
{3.12987*^-10, 
3.12987*^-11, 
3.12987*^-12, 
3.12987*^-13, 
3.12987*^-14, 
3.12987*^-15, 
3.12987*^-16, 
3.1298700000000004*^-17, 
3.1298700000000002*^-18, 
3.12987*^-19, 
3.12987*^-20, 
3.1298699999999995*^-21, 
3.1298700000000003*^-22, 
3.1298700000000004*^-23, 
3.1298700000000002*^-24, 
3.1298699999999995*^-25} 

Đối với cú pháp đầu vào * ^, đó thực sự là một phân tích cú pháp (thực sự từ vựng). Không có sức mạnh chính xác rõ ràng nào của 10 được tính toán. Một giá trị dấu chấm động được xây dựng và nó trung thành nhất có thể, trong phạm vi cho phép từ nhị phân đến thập phân, đến đầu vào của bạn. InputForm sẽ hiển thị nhiều chữ số như được sử dụng để nhập số, bởi vì đó thực sự là số thập phân gần nhất với giá trị nhị phân tương ứng đã được tạo.

Khi bạn vượt qua giới hạn của số dấu chấm động máy, bạn sẽ nhận được một độ chính xác tùy ý tương tự. Nó không còn là machinePrecision nhưng thực sự là $ MachinePrecision (đó là tương tự bignum với máy nổi trong Mathematica).

Những gì bạn thấy trong InputForm cho 3.12987 *^- 596 (một số thập phân kết thúc bằng một số 9) là, tôi tin rằng, do đại diện nội bộ của Mathematica liên quan đến việc sử dụng bit bảo vệ. Chỉ có 53 bit mantissa, tương tự như một máy đôi, sau đó đại diện thập phân gần nhất sẽ là sáu chữ số mong đợi.

Daniel Lichtblau Nghiên cứu Wolfram

+0

+1 để sử dụng 'không hoạt động 'trong khi mô tả hành vi của phần mềm. –

+0

Cảm ơn bạn vì thông tin chi tiết. Việc chuyển đổi sang độ chính xác tùy ý luôn làm tôi bối rối, nhất là khi tôi phải ghi một lượng lớn dữ liệu vào một tệp và đột nhiên ~ 16 ký tự dữ liệu chính xác được thêm vào mọi số! – Timo

+0

@Timo 16 ký tự có vẻ quá mức. Bạn có nghĩa là số lượng bạn nhận được là khoảng 16 byte lớn hơn một máy tính tăng gấp đôi? Hoặc bạn quan sát hiện tượng bit bảo vệ đó? Nếu những con số được đề cập trong thực tế nằm trong phạm vi kích thước của máy đôi thì hãy đăng hoặc gửi cho tôi một ví dụ, vì nó có thể chỉ ra một vấn đề trong mã của bạn hoặc trong Xuất hoặc Xuất của Mathematica, tùy theo bạn đang sử dụng. –

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