Mathematica:“Sqrt [x]的15位数产生x超过42亿的数字”

时间:2010-12-23 23:04:38

标签: wolfram-mathematica precision

我在Mathematica中做了这个来计算Sqrt [5]:

a[0] = 2 
a[n_] := a[n] = a[n-1] - (a[n-1]^2-5)/2/a[n-1] 

[25]与Sqrt [5]有多接近?

N[Sqrt[5]-a[25]] // FortranForm 
4.440892098500626e-16 

[25] ^ 2到5有多接近?

N[a[25]^2-5] // FortranForm 
8.305767102358763e-42074769 

这对我来说似乎很奇怪。我估计:如果x在Sqrt [5]的10 ^ -n之内, 然后x ^ 2在10 ^( - 2 * n)之内,给出或取。没有?事实上:

a[25]^2 = (Sqrt[5]-4.440892098500626e-16)^2 ~ 5 - 2*5*4.440892098500626e-16 

(扩展(a-b)^ 2),因此精度应该只有大约14位数 (或一般n位数)。

当然,牛顿的方法在25中只能产生15位准确数字 迭代也似乎很奇怪。

我在上面的计算中过早地失去了精度吗?请注意:

N[Log[Sqrt[5]-a[25]]] // FortranForm 
-35.35050620855721 

同意上面的15位精度,即使我在之后做N [] 记录日志(所以它应该是准确的)。

1 个答案:

答案 0 :(得分:1)

问题是Mma如何计算你的序列。

a [n]是有理数。让我们以loglog标度查看分子的数量级:

a[0] = 2 
a[n_] := a[n] = a[n-1] - (a[n-1]^2-5)/2/a[n-1] 
ListPlot@Table[Log[10, Log[10, Numerator[ a[i]]]], {i, 1, 25}]

alt text

所以,你的分子正以双指数的形式增加。

在[25]之前实现了10 ^ -16精度:

For[i = 1, i < 5, i++,
 Print["dif[", i, "]= ", N[a[i] - Sqrt[5], 16]]
 ]

dif[1]= 0.01393202250021030

dif[2]= 0.00004313361132141470

dif[3]= 4.160143063513508*10^-10

dif[4]= 3.869915959583412*10^-20  

之后,您已开始控制除法的精度,因为[5]的分子已有20位数。