Re: why extending numbers by zeros instead of dropping precision is a good idea / iterating sqrt
- To: mathgroup at smc.vnet.net
- Subject: [mg117855] Re: why extending numbers by zeros instead of dropping precision is a good idea / iterating sqrt
- From: Richard Fateman <fateman at eecs.berkeley.edu>
- Date: Sat, 2 Apr 2011 02:39:50 -0500 (EST)
On 3/31/2011 10:07 AM, Daniel Lichtblau wrote: ... (summarizing) iterating square root of 2, in fixed precision, eventually gets to 1.... ... iterating square root of 2; call it 1+epsilon, with increasing precision, gets you to 1+epsilon/(2^n) + ... > > The problematic aspect to the computation, in this case, is fixed > precision arithmetic. Not because Mathematica's significance > arithmetic does error tracking but rather simply because it allows for > precision to go up, when justified. I'll show using bigfloats but in > fixed precision. I use more iterations to make quite clear that the > result is bad. One can check that in default mathematica arithmetic > this would still ahve worked just fine. > > In[398]:= iters = 70; > Block[{$MinPrecision = 20, $MaxPrecision = 20}, > res = NestList[s[#, 1/2] &, two, iters]]; > Last[res] > Last[res]^(2^iters) > > Out[400]= 1.0000000000000000000 > > Out[401]= 0``-1.6531076715578628 > > > Daniel Lichtblau > Wolfram Research > The problem (which occurs in other contexts too), is that you are computing a function which differs from 1 by a small amount. Let's call it p=1+f(x). What you can do is compute f(x). Sometimes you don't really need p to high precision if all you are going to do is compute p-1. This happens enough in computing Exp[x] that some scientific subroutine libraries will have functions to compute expm1(x) defined as Exp[x]-1, for small x. Otherwise, computing Exp[x] using the regular approximations needs lots of bits. Also, log1p for computing log(1+x) accurately for small x, for the same reason. Similarly, if you want to compute q(eps,n) := (1+eps)^(1/(2^n), consider instead computing r(eps,n):= q(eps,n)-1. This can be computed without using additional costly precision. You can then add the 1 back, later, if you want. Of course if you are just doing it one-off, who cares. RJF