RE: Accuracy and Precision
- To: mathgroup at smc.vnet.net
- Subject: [mg36936] RE: Accuracy and Precision
- From: "DrBob" <drbob at bigfoot.com>
- Date: Wed, 2 Oct 2002 03:33:03 -0400 (EDT)
- Reply-to: <drbob at bigfoot.com>
- Sender: owner-wri-mathgroup at wolfram.com
I think I'd prefer that Mathematica gave me a clue -- without being asked explicitly in JUST the right way that only you know and had forgotten -- that there's a precision problem. Oddly enough, when you DO ask it nicely, you get error messages, but if you're not aware there's a problem, it lets you go on your merry way, working with noise. Bobby -----Original Message----- From: Andrzej Kozlowski [mailto:andrzej at tuins.ac.jp] To: mathgroup at smc.vnet.net Subject: [mg36936] Re: Accuracy and Precision So? It's just as it should be, isn't it? Andrzej Andrzej Kozlowski Toyama International University JAPAN http://sigma.tuins.ac.jp/~andrzej/ On Wednesday, October 2, 2002, at 09:02 AM, DrBob wrote: > Go one step further: > > Clear[f, a, b, k] > k = $MachinePrecision; > f = SetAccuracy[333.75*b^6 + > a^2*(11*a^2*b^2 - b^6 - > 121*b^4 - 2) + > 5.5*b^8 + a/(2*b), k]; > a = 77617.; b = 33096.; > a = SetAccuracy[a, k]; > b = SetAccuracy[b, k]; > f > Accuracy[f] > Precision[f] > > -5.517164009`0*^19 > > Accuracy::mnprec:Value -23 would be inconsistent with $MinPrecision; > bounding by $MinPrecision instead. > > -20 > > 0 > > Accuracy::"mnprec":"Value \!\(-23\) would be inconsistent with > $MinPrecision; \ > bounding by $MinPrecision instead." > > See that? NO precision. > > Bobby > > -----Original Message----- > From: Andrzej Kozlowski [mailto:andrzej at platon.c.u-tokyo.ac.jp] To: mathgroup at smc.vnet.net > Sent: Tuesday, October 01, 2002 5:53 PM > Cc: drbob at bigfoot.com > Subject: [mg36936] Re: Accuracy and Precision > > You are of course right, I forgot that Mathematica does not try to keep > > precision or accuracy of machine arithmetic computations. But I think > the actual precision you set need not be higher than machine precision, > > it just has to be set explicitely (is that right?). For example: > > In[1]:= > Clear[f,a,b,k] > > In[2]:= > k = $MachinePrecision; > > In[3]:= > f=SetAccuracy[333.75*b^6+a^2*(11*a^2*b^2-b^6-121*b^4-2)+5.5*b^8+a/ > (2*b),k]; > > In[4]:= > a=77617.;b=33096.; > > In[5]:= > a=SetAccuracy[a,k]; > > In[6]:= > b=SetAccuracy[b,k]; > > > In[7]:= > f > > Out[7]= > \!\(\(-5.51716400890319`-2.8311*^19\)\) > > In[8]:= > Accuracy[f] > > From In[8]:= > Accuracy::mnprec: Value -23 would be inconsistent with $MinPrecision; \ > bounding by $MinPrecision instead. > > Out[8]= > -20 > > > Andrzej > > > On Wednesday, October 2, 2002, at 01:45 AM, Allan Hayes wrote: > >> Andrzej >> >> Yes, like you I took the original question to be about how to get the > >> result >> of using the naive rational versions in place of the inexact numbers. >> Bobby raises the question of how we might know accuracy of the result. >> >> You answer this with >>> a = 77617.; b = 33096.; >>> >>> In[2]:= >>> f := 333.75*b^6 + a^2*(11*a^2*b^2 - b^6 - 121*b^4 - 2) + >>> 5.5*b^8 + a/(2*b) >>> >>> In[3]:= >>> f >>> >>> Out[3]= >>> -1.1805916207174113*^21 >>> >>> In[4]:= >>> Accuracy[%] >>> >>> Out[4]= >>> -5 >> >> However this computation is done in machine arithmetic, which means >> that >> Mathematica keeps no check on the accuracy and precision of the >> computation, >> and Mathematica gives the default accuracy value without any real >> signifcance: >> >> $MachinePrecision - Log[10,Abs[f]]//Round >> >> -5 >> >> To get meaningful accuracy and precision values we need to force the >> computation to be in bignums (bigfloat, arbitrary precision) >> arithmetic. >> Mathematica then keeps track of the accuracy and precision that it can >> guarantee. >> >> Clear[f,a,b,k] >> k=50; >> >> f=SetAccuracy[333.75*b^6+a^2*(11*a^2*b^2-b^6-121*b^4-2)+5.5*b^8+a/ >> (2*b),k]; >> a=77617.;b=33096.; >> a=SetAccuracy[a,k]; >> b=SetAccuracy[b,k]; >> f >> >> -0.82739605995 >> >> Accuracy[f] >> >> 11 >> >> Precision[f] >> >> 11 >> >> Which tells us that the error in the computed value of f is not more > >> than >> >> 10^-11 >> >> >> The above results are rounded. More accurately we get >> >> Accuracy[f, Round->False] >> >> 11.4956 >> >> Precision[f, Round->False] >> >> 11.4133 >> >> There are several related issues here: >> - is the precision (accuracy) of rhe input known? >> - how does Mathematica interpret what one gives it? >> - how does Mathematica go about the calculation? >> >> -- >> Allan >> >> --------------------- >> Allan Hayes >> Mathematica Training and Consulting >> Leicester UK >> www.haystack.demon.co.uk >> hay at haystack.demon.co.uk >> Voice: +44 (0)116 271 4198 >> Fax: +44 (0)870 164 0565 >> >> >> "Andrzej Kozlowski" <andrzej at platon.c.u-tokyo.ac.jp> wrote in message >> news:anbofj$e7u$1 at smc.vnet.net... >>> It seems clear to me that what Allan and what you mean by "succeeds" >>> here refer to quite different things and your objection is therefore >>> beside the point. There are obviously two ways in which one can >>> interpret the original posting. The first interpretation, which Allan >>> and myself adopted, was that the question concerned purely the >>> computational mechanism of Mathematica. Or, to put it in other words, >>> it was "why are the results of these two computations not the same?". >>> In this sense "success" means no more than making Mathematica return >>> the same answer using the two different routes the original poster >>> used. >>> You on the other hand choose to assume that the posting shows that > its >>> author does not understand not just the mechanism of significance >>> arithmetic used by Mathematica but also computations with inexact >>> numbers in general. I do not think this is necessarily the correct >>> assumption. I also don't see that Mathematica is doing anything > wrong. >>> After all, one can always check the accuracy of your answer: >>> >>> In[1]:= >>> a = 77617.; b = 33096.; >>> >>> In[2]:= >>> f := 333.75*b^6 + a^2*(11*a^2*b^2 - b^6 - 121*b^4 - 2) + >>> 5.5*b^8 + a/(2*b) >>> >>> In[3]:= >>> f >>> >>> Out[3]= >>> -1.1805916207174113*^21 >>> >>> In[4]:= >>> Accuracy[%] >>> >>> Out[4]= >>> -5 >>> >>> which tells you that it can't be very reliable. What more do you >>> demand? >>> >>> Andrzej >>> >>> >>> Andrzej Kozlowski >>> Yokohama, Japan >>> http://www.mimuw.edu.pl/~akoz/ >>> http://platon.c.u-tokyo.ac.jp/andrzej/ >>> >>> On Tuesday, October 1, 2002, at 02:59 AM, DrBob wrote: >>> >>>> Actually, we don't know whether SetAccuracy "succeeds", because we >>>> don't >>>> know how inexact those numbers really are. If they are known to > more >>>> digits than shown in the original post, they should be entered with > >>>> as >>>> much precision as they deserve. If not, there's no trick or >>>> algorithm >>>> that will give the result precision, because the value of f really > is >>>> "in the noise". That is, we have no idea what the value of f should >>>> be. >>>> >>>> Mathematica's failing is in returning a value without pointing out >>>> that >>>> it has no precision. >>>> >>>> Bobby >>>> >>>> -----Original Message----- >>>> From: Allan Hayes [mailto:hay at haystack.demon.co.uk] To: mathgroup at smc.vnet.net >>>> Sent: Monday, September 30, 2002 11:59 AM >>>> Subject: [mg36936] Re: Accuracy and Precision >>>> >>>> Andrzej, Bobby, Peter >>>> >>>> It looks as if using SetAccuracy succeeds here because the inexact >>>> numbers >>>> that occur have finite binary representations. If we change them >>>> slightly to >>>> avoid this then we have to use Rationalize: >>>> >>>> 1) Using SetAccuracy >>>> >>>> Clear[a,b,f] >>>> >>>> >>>> f=SetAccuracy[333.74*b^6+a^2*(11*a^2*b^2-b^6-121*b^4-2)+5.4*b^8+a/ >>>> (2*b), >>>> Infinity]; >>>> >>>> a=77617.1; >>>> b=33096.1; >>>> >>>> a=SetAccuracy[a,Infinity];b=SetAccuracy[b,Infinity]; >>>> >>>> f >>>> >>>> >>>> -1564032114908486835197494923989618867972540153873951942813115514949 >>>> 3891236234\ >>>> >>>> > 525007719168693704591197760187988046304361497869199129319625743010292 >>>> 36 >>>> 3 >>>> 1246 >>>> 75\ >>>> >>>> / >>>> > 108671061439707605510003578275547938881981431359756495796079898677435 >>>> 72 >>>> 8240 >>>> 16\ >>>> 0653953612982932181371232436367739737604096 >>>> >>>> 2) Rewriting as fractions >>>> >>>> a=776171/10; >>>> b=330961/10; >>>> >>>> f=33374/100*b^6+a^2*(11*a^2*b^2-b^6-121*b^4-2)+54/10*b^8+a/(2*b) >>>> >>>> -(5954133808997234115690303589909929091649391296257/ >>>> 41370125000000) >>>> >>>> 3) Using Rationalize >>>> >>>> Clear[a,b,f] >>>> >>>> >>>> f=Rationalize[333.74*b^6+a^2*(11*a^2*b^2-b^6-121*b^4-2)+5.4*b^8+a/ >>>> (2*b), >>>> 0]; >>>> >>>> a=77617.1; >>>> b=33096.1; >>>> >>>> a=Rationalize[a,0];b=Rationalize[b,0]; >>>> >>>> f >>>> >>>> -(5954133808997234115690303589909929091649391296257/ >>>> 41370125000000) >>>> >>>> >>>> I use Rationalize[. , 0] besause of results like >>>> >>>> Rationalize[3.1415959] >>>> >>>> 3.1416 >>>> >>>> Rationalize[3.1415959,0] >>>> >>>> 31415959/10000000 >>>> -- >>>> Allan >>>> >>>> --------------------- >>>> Allan Hayes >>>> Mathematica Training and Consulting >>>> Leicester UK >>>> www.haystack.demon.co.uk >>>> hay at haystack.demon.co.uk >>>> Voice: +44 (0)116 271 4198 >>>> Fax: +44 (0)870 164 0565 >>>> >>>> >>>> "Andrzej Kozlowski" <andrzej at tuins.ac.jp> wrote in message >>>> news:an8s8i$6pk$1 at smc.vnet.net... >>>>> Well, first of of all, your using SetAccuracy and SetPrecision does >>>>> nothing at all here, since they do not change the value of a or b. > >>>>> You >>>>> should use a = SetAccuracy[a, Infinity] etc. But even then you > won't >>>>> get the same answer as when you use exact numbers because of the >>>>> way >>>>> you evaluate f. Here is the order of evaluation that will give you > >>>>> the >>>>> same answer, and should explain what is going on: >>>>> >>>>> f = SetAccuracy[333.75*b^6 + a^2*(11*a^2*b^2 - b^6 - 121* >>>>> b^4 - 2) + 5.5*b^8 + a/(2*b), Infinity]; >>>>> >>>>> a = 77617.; >>>>> >>>>> >>>>> b = 33096.; >>>>> >>>>> a = SetAccuracy[a, Infinity]; b = SetAccuracy[b, Infinity]; >>>>> >>>>> f >>>>> >>>>> 54767 >>>>> -(-----) >>>>> 66192 >>>>> >>>>> Andrzej Kozlowski >>>>> Toyama International University >>>>> JAPAN >>>>> >>>>> >>>>> >>>>> On Sunday, September 29, 2002, at 03:55 PM, Peter Kosta wrote: >>>>> >>>>>> Could someone explain what is going on here, please? >>>>>> >>>>>> In[1]:= >>>>>> a = 77617.; b = 33096.; >>>>>> >>>>>> In[2]:= >>>>>> SetAccuracy[a, Infinity]; SetAccuracy[b, Infinity]; >>>>>> SetPrecision[a, Infinity]; SetPrecision[b, Infinity]; >>>>>> >>>>>> In[4]:= >>>>>> f := 333.75*b^6 + a^2*(11*a^2*b^2 - b^6 - 121*b^4 - 2) + 5.5*b^8 + >>>>>> a/(2*b) >>>>>> >>>>>> In[5]:= >>>>>> SetAccuracy[f, Infinity]; SetPrecision[f, Infinity]; >>>>>> >>>>>> In[6]:= >>>>>> f >>>>>> >>>>>> Out[6]= >>>>>> -1.1805916207174113*^21 >>>>>> >>>>>> In[7]:= >>>>>> a = 77617; b = 33096; >>>>>> >>>>>> In[8]:= >>>>>> g := (33375/100)*b^6 + a^2*(11*a^2*b^2 - b^6 - 121*b^4 - 2) + >>>>>> (55/10)*b^8 + a/(2*b) >>>>>> >>>>>> In[9]:= >>>>>> g >>>>>> >>>>>> Out[9]= >>>>>> -(54767/66192) >>>>>> >>>>>> In[10]:= >>>>>> N[%] >>>>>> >>>>>> Out[10]= >>>>>> -0.8273960599468214 >>>>>> >>>>>> Thanks, >>>>>> >>>>>> PK >>>>>> >>>>>> >>>>>> >>>>> >>>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>> >>> >>> >> >> >> >> >> >> >> >> >> >> > Andrzej Kozlowski > Yokohama, Japan > http://www.mimuw.edu.pl/~akoz/ > http://platon.c.u-tokyo.ac.jp/andrzej/ > > > >