Re: why extending numbers by zeros instead of dropping precision is a good idea
- To: mathgroup at smc.vnet.net
- Subject: [mg117867] Re: why extending numbers by zeros instead of dropping precision is a good idea
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Sat, 2 Apr 2011 02:41:59 -0500 (EST)
FixedPoint is stopping when consecutive iterates satisfy SameQ. That can
happen long before the iterates stop changing -- when the difference
between two iterates is "zero" to the minimum precision of the two.
Bobby
On Fri, 01 Apr 2011 02:35:55 -0500, Bill Rowe <readnews at sbcglobal.net>
wrote:
> On 3/31/11 at 4:06 AM, fateman at eecs.berkeley.edu (Richard Fateman)
> wrote:
>
>> It is occasionally stated that subtracting nearly equal
>> quantities from each other is a bad idea and somehow unstable
>> or results in noise. (JT Sardus said it on 3/29/2011, for example.)
>
>> This is not always true; in fact it may be true hardly ever.
>
>> It is, for example, the essence of Newton iteration.
>
>> Here's simple example. If you have an approximation x for the
>> square root of n, then
>
>> r[x,n] gives you a better approximation where
>
>> r[x_,n_]:= x- (x^2-n)/(2*x).
>
>> Let's try it out.
>
>> x=1.0
>> r[x,2]
>> r[%,2]
>> r[%,2]
>> r[%,2]
>> gets us to 1.41421, which is pretty good.
>> If we try
>> Do[x = r[x, 2], {100}]
>> we see that x is still 1.41421.
>
>> That's using machine hardware floats.
>
>> Now let's try it with significance arithmetic, using more precision
>
>> x=1.0`20
>> two=2.0`20
>> r[x,two]
>
>> .... this gives (a highly precision version of) 1.5
>
>> Let's see if we can get a really good approximation for sqrt(2).
>
>> And print out the results each iteration
>
>> Do[x = r[x, two];Print[x], {100}]
>
>> Oh dear, we get lower and lower accuracy and precision,
>> eventually resulting in a division by zero. This loop
>> converges to the square root of 2 being Indeterminate.
>
>> Now this is no surprise to some people, but it may be to some
>> others. Indeed one could say "there is no bug there,
>> Mathematica is doing exactly what it is documented to do."
>> Nevertheless, some other people might find it surprising. Maybe
>> even distressing. If you figure out what is going on (it is
>> not that complicated...)... you see:
>
>> It is the consequence of not computing x^2-n, the difference
>> of two nearly equal quantities, accurately.
>
>> Now you can avoid this problem by setting $MinPrecision to (say) 20.
>
> An alternative would be to use FixedPoint. That is
>
> In[27]:= FixedPoint[r[#, 2] &, 1.0`20]
>
> Out[27]= 1.414213562373095049
>
> In[28]:= Precision[%]
>
> Out[28]= 18.2351
>
> In[29]:= FixedPoint[r[#, 2.0`20] &, 1.0`20]
>
> Out[29]= 1.41421356237309505
>
> In[30]:= Precision[%]
>
> Out[30]= 18.0154
>
> In[31]:= N[Sqrt[2], 20]
>
> Out[31]= 1.4142135623730950488
>
> It seems FixedPoint is doing something behind the scene that
> avoids the problem you describe above.
>
> Note, I am not arguing either Mathematica is doing the right
> thing or the wrong thing when using a Do as you did. Simply, my
> experience with Mathematica tells me I generally get better
> behavior when I use functions intended to do exactly what I want
> than I do when I attempt to code my own version.
>
> It seems FixedPoint is doing something behind the scene that
> avoids the problem you describe above.
>
>
--
DrMajorBob at yahoo.com