2011-02-09 149 views
5

this切線相關的問題,數字格式化到底發生了什麼?Mathematica內部數字格式和精度

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

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

如果使用*10.^作爲乘數的過渡是在那裏你會天真地期望它是:

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

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

*^遠一點採取的過渡,儘管它是機器精度啓動剝落出來:

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 

基地開始分手很久以後

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 

我假設這些轉換與Mathematica內部保存數字的格式有關,但是有誰知道或者關心如何冒險進行有教育的猜測?

回答

8

如果我理解正確,您在想InputForm什麼時候會顯示6位以上的數字。如果是這樣,它會隨意發生,只要需要更多數字來「最好」代表評估後獲得的數字。由於評估涉及10 ^(某些功率)的顯式乘法,並且由於十進制輸入不需要(在這種情況下不是)可以用二進制精確表示,所以可以得到與期望值不同的細微差異。

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} 

至於* ^輸入語法,這實際上是一個解析(實際上是詞法)結構。計算10的顯式精確冪。一個浮點值的構造,儘可能在二進制到十進制允許的範圍內忠實於您的輸入。 InputForm將顯示​​與輸入數字一樣多的數字,因爲這實際上是與創建的相應二進制值最接近的小數。

當你超越機器浮點數的限制時,你會得到一個任意精度的模擬。它不再是machinePrecision,而是實際上是$ MachinePrecision(這是在Mathematica中機器漂浮的bignum類似物)。

你在InputForm中看到的3.12987 *^- 596(十進制數以9爲結尾),我相信是由Mathematica的內部表示引起的,它涉及到使用保護位。如果只有53個尾數位,類似於一個機器雙位,那麼最接近的十進制表示將是預期的六位數。

丹尼爾Lichtblau 沃爾夫勒姆研究

+0

+1使用`haphazardly`在描述軟件的行爲。 – 2011-02-09 16:58:23