2011-03-30 22 views
1

一個很奇怪的問題,我在MMA V7.0這樣做:在數學

r[x_] := Rationalize[x, 0]; N[Nest[Sqrt, 10., 53] // r, 500]

它給了我 1.000000000000000222044604925031308084726333618164062500000000000000000

但是,如果我走一步 N[Nest[Sqrt, 10., 54] // r, 500]

我得到了全零。有人知道一個解釋,或者它是一個錯誤?

此外,看起來像這樣從解決方案產生更多數字Nest[Sqrt, 10., 53]不能很好地工作。如何獲得此計算的更有效數字?

非常感謝。

編輯

如果我這樣做Nest[Sqrt, 10., 50],我還是得到了很多顯著數字。

回答

3
InputForm /@ NestList[Sqrt, 10., 54] 

10. 
3.1622776601683795 
1.7782794100389228 
1.333521432163324 
1.1547819846894583 
1.0746078283213176 
1.036632928437698 
1.018151721718182 
1.0090350448414476 
1.0045073642544626 
1.002251148292913 
1.00112494139988 
1.0005623126022087 
1.00028111678778 
1.0001405485169472 
1.0000702717894114 
1.000035135277462 
1.0000175674844227 
1.0000087837036347 
1.0000043918421733 
1.0000021959186756 
1.000001097958735 
1.0000005489792168 
1.0000002744895706 
1.000000137244776 
1.0000000686223856 
1.000000034311192 
1.0000000171555958 
1.0000000085777978 
1.0000000042888988 
1.0000000021444493 
1.0000000010722245 
1.0000000005361123 
1.0000000002680562 
1.0000000001340281 
1.000000000067014 
1.000000000033507 
1.0000000000167535 
1.0000000000083769 
1.0000000000041884 
1.0000000000020943 
1.0000000000010472 
1.0000000000005236 
1.0000000000002618 
1.000000000000131 
1.0000000000000655 
1.0000000000000329 
1.0000000000000164 
1.0000000000000082 
1.000000000000004 
1.000000000000002 
1.0000000000000009 
1.0000000000000004 
1.0000000000000002 
1. 

投擲在這個N[x, 500]就像是試圖從石頭擠水。


上面的計算是以機器精度完成的,這是非常快的。如果您願意放棄速度,您可以通過指定輸入值的非機器精度來利用Mathematica's arbitrary precision arithmetic。 「backtick」可用於執行此操作(如下例所示),或者您可以使用SetPrecisionSetAccuracy。在這裏我將指定輸入是數字10到20位數的精度。

NestList[Sqrt, 10`20, 54] 

10.000000000000000000 
3.1622776601683793320 
1.7782794100389228
. 
. 
. 
1.00000000000000051127659728012947952 
1.00000000000000025563829864006470708 
1.000000000000000127819149320032345372 

正如你可以看到你不需要使用InputForm作爲數學會自動打印任意精度的數字來,因爲它可以準確的許多地方。

如果您確實使用InputFormFullForm,您將看到一個反碼,然後是一個數字,它是該數字的當前精度。

+0

嚮導:1 ,你知道一些方法來獲得比InputForm更多的數字嗎?謝謝。 – 2011-03-30 23:38:16

+0

@Qiang Li是的,您可以通過指定輸入數字的非機器精度來踢任意精度引擎。我將編輯以提供一個示例。 – 2011-03-30 23:55:28

+0

嚮導,我明白了。忘了我可以使用'''。 :)關於我原來的問題,我仍然困惑於爲什麼在多次應用函數'Sqrt'後答案不正確。也許這是因爲「合理化」功能?即使你以另一個方向解決我的問題,我現在也不能接受你的答案。非常感謝。 – 2011-03-31 00:36:20

4

如果你這樣做了54次,你沒有零位以外的有效數字。因此,像你這樣合理化(只保留位模式)給出了你所看到的。

InputForm[n53 = Nest[Sqrt, 10., 53]] 

缺貨[180] // InputForm = 1.0000000000000002

InputForm[n54 = Nest[Sqrt, 10., 54]] 

缺貨[181] // InputForm = 1。

Rationalize[n53, 0] 

4503599627370496分之4503599627370497

Rationalize[n54, 0] 

缺貨[183]​​ = 1

對於好奇:問題是不降解的意義上與迭代計算的精度損失。事實上,迭代這些平方根實際上提高了精度。我們可以看到這個與bignum輸入。

InputForm[n54 = Nest[Sqrt, 10.`20, 54]] 

缺貨[188] // InputForm = 1.0000000000000001278191493200323453724568038240908339267044`36.25561976585499

下面是實際的問題。當我們使用機器編號時,在54次迭代之後,在結果機器中除零之外沒有有效數字。也就是說,我們對數字的大小限制是原因。

原因不是太神祕。調用結果值1 + eps。然後我們有(1 + eps)^(2^54)等於(近似於)到10.然後二階展開顯示eps必須小於機器epsilon。

InputForm[epsval = 

第一頁[請選擇分類[ eps /。 N [Solve [Sum [eps^j * Binomial [2^54,j],{j,2}] == 9,eps]], Head [#] === Real & &#> 0 &] ] 輸出[237] // InputForm = 1.864563472253985 *^- 16

$MachineEpsilon 

缺貨[235] = 2.22045 * 10^-16

丹尼爾Lichtblau Wolfram Research的