Re: Pi == 3 for imprecise values of 3?
- To: mathgroup at smc.vnet.net
- Subject: [mg22951] Re: Pi == 3 for imprecise values of 3?
- From: Robert Knapp <rknapp at wolfram.com>
- Date: Fri, 7 Apr 2000 02:54:33 -0400 (EDT)
- Organization: Wolfram Research, Inc.
- References: <8chbil$9ei@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Gavin Scott wrote: > > In playing with my spiffy new copy of 4.0.2 for Windows, I'm curious > why: > > In[1]:= N[Pi] == 3`0 > Out[1]= True > > It seems that a value compared to a number with very low precision > will result in Equal[] returning True. > > In[2]:= 1 == 2`0.00001 > Out[2]= True > > In[3]:= 1 == 2`0.0001 > Out[3]= False > > but then > > In[4]:= 10^10 == 2`0 > Out[4]= False > > I suppose that when you have zero digits of accuracy then you have no idea > what the value is, so it certainly *could* be equal to any value, but I > find it surprising that == chooses True over False in these cases. > In Mathematica, Equal (and Less and Greater) use a tolerance so that two numbers do not have to be identical to be deemed Equal. THe motivation behind this is beyond the scope of a simple reply, but if you are interested, I suggest section 4.2.2 on Accuracy of floating point numbers in Knuth's "Seminumerical Algorithms" Given a tolerance, t, two numbers a and b are considered Equal to that tolerance if Precision[a - b] < t A way of interpreting this is that a and b must be the same except in the t least significant digits since the other digits must cancel in the subtraction. So in your example: (Set $MinPrecision here so it is not at all restricted) In[1]:= Block[{$MinPrecision = -Infinity}, Precision[Pi - 3`0, Round -> False]] Out[1]= -1.32608 The tolerance Equal uses is In[2]:= $EqualTolerance Out[2]= 2.10721 which corresponds to 7 bits. In fact, with this tolerance, In[3]:= Block[{$MinPrecision = -Infinity}, Precision[Pi - 3`3.3, Round -> False]] Out[3]= 1.97392 so... In[4]:= Pi == 3`3.3 Out[4]= True Rob Knapp Wolfram Research, Inc.