Re: comparing implicit 0 with machine floats
- To: mathgroup at smc.vnet.net
- Subject: [mg71205] Re: [mg71108] comparing implicit 0 with machine floats
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Fri, 10 Nov 2006 06:38:09 -0500 (EST)
- References: <11095316.1163039426494.JavaMail.root@eastrmwml01.mgt.cox.net> <F3C6DEC6-64C4-45D4-98CC-8A79F52F3B0A@mimuw.edu.pl>
In fact, things look even more surprising (to me anyway). In[1]:= Simplify[Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] == 0.]//Timing Out[1]= {0.046486 Second,True} while In[2]:= Timing[Simplify[Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]]]] Out[2]= {0.0008739999999998194*Second, Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]]} Note that the first evaluation took a non-negligible amount of time. One reason why I am surprised is that I would have thought one would need to increase $MaxExtraPrecision to something like Accuracy[0.] 307.653 Andrzej Kozlowski On 9 Nov 2006, at 12:10, Andrzej Kozlowski wrote: > Yes indeed, it does. This is rather curious because Simplify does > not actually reduce Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] to 0 > (since Simplify does not make use of RootReduce) one needs > FullSimplify to do that. > > In[51]:= > Simplify[Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]]] > > Out[51]= > Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] > > In[52]:= > FullSimplify[Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]]] > > Out[52]= > 0 > > Andrzej Kozlowski > > On 9 Nov 2006, at 11:30, Bob Hanlon wrote: > >> Using Simplify will force the comparison >> >> Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] == 2.//Simplify >> >> False >> >> Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] == N[10^3]//Simplify >> >> False >> >> >> Bob Hanlon >> >> ---- Andrzej Kozlowski <akoz at mimuw.edu.pl> wrote: >>> Consider the following: >>> >>> >>> Sqrt[2] + Sqrt[3] - Sqrt[4 + 2*Sqrt[6]] == 2. >>> >>> False >>> >>> No problem here. Now let's make a small change >>> >>> In[17]:= >>> Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] == 2. >>> >>> Out[17]= >>> >>> Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] == 2. >>> >>> In fact the expression on the LHS is exactly 0: >>> >>> In[19]:= >>> RootReduce[Sqrt[2]+Sqrt[3]-Sqrt[5+2*Sqrt[6]]] >>> >>> Out[19]= >>> >>> The curious thing is that if you try a comparison between a zero of >>> this kind and any machine float, however large, Mathematica 5.1 will >>> return the original input: >>> >>> In[20]:= >>> Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] == N[10^3] >>> >>> Out[20]= >>> Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6]] == 1000. >>> >>> yet if the number of the left hand side is altered, however >>> slightly, >>> the comparison will be made: >>> >>> >>> Sqrt[2] + Sqrt[3] - Sqrt[5 + 2*Sqrt[6+1/10^20]] == 2. >>> >>> False >>> >>> This suggests that Mathematica actually did perform a computation of >>> the left hand side in the examples where it just returned the input >>> and having discovered that it could not determine if the LHS is an >>> exact zero decided "not to answer the question". But this seems >>> quite >>> unreasonable; after all it is not being asked if the LHS is an exact >>> 0, or even an approximate 0, but if it is an approximate large >>> number >>> like 1000., and this it certainly can decide. >>> >>> I believe this used to be handled differently (better?) in older >>> versions of Mathematica but I no longer have any installed to check. >>> >>> Andrzej Kozlowski >>> >> >