The comparator show below won't work with values on the opposite sides of 0. So the question is still open.
--- Oleg Kobchenko <[EMAIL PROTECTED]> wrote: > So you are confirming what I discovered to myself. > I expected tolerance to be uniform in space, > or at least not singular at zero. > (Thinking of it as a _identity radius_, > being within which two points are equal). > As it turns out, the identity radius is proportional > to the (max) magnitude of the points. It is the same > as tolerance t in the vicinity of 1: > > 1=1+2^_44 > 1 > 1=1+2^_43 > 0 > > And identity radius grows with the magnitude > > (2^32)=(2^32)+2^_44+32 > 1 > (2^32)=(2^32)+2^_44+33 > 0 > (2^32),2^_44+32 NB. point and radius > 4.29497e9 0.000244141 > > In zero the radius converges to 0, thus no tolerance. > > (2^_1024)=(2^_1024)+2^_44-1024 > 1 > (2^_1024)=(2^_1024)+2^_44-1023 > 0 > (2^_1024) , 2^_44-1024 NB. point and radius > 5.56268e_309 3.16202e_322 > > In other words, as we move closer to 0, the > radius shrinks and never reaches to include 0 > (unless t >: 1). > > Such tolerance model becomes an issue if the domain > is in the region that includes 0, for examples -3..3. > Typical application, is when we do calculations > with errors, of course, and we still want to identify > the same points. > > To make it work, we can transform the domain to > for example, [-6..-3) U [3,6]: > > (1:[EMAIL PROTECTED](*@|) * 3 + |) 1 _1 0 1j_1 3j_3 3 > 4 _4 3 3.12132j_3.12132 5.12132j_5.12132 6 > > So how would such nicer comparator look like? > > eq=: 1 : '|@- <:!.0 m * >.&|' > tr=: 1 : '1:[EMAIL PROTECTED](*@|) * m + |' > eqt=: 2 : '(m eq)&:(n tr)' > > 0 (0.001 eqt 1) 0+0.001 > 1 > 0 (0.001 eqt 1) 0+0.002 > 0 > 0 (0.001 eqt 3) 0+0.001*3 > 1 > 0 (0.001 eqt 3) 0+0.002*3 > 0 > > > --- Roger Hui <[EMAIL PROTECTED]> wrote: > > > It is a direct consequence of the definition of tolerant > > equality that comparisons with 0 are not tolerant: > > > > x=!.t y if (|x-y)<:t*x>.&|y definition of tolerant = > > 0=!.t y if (|0-y)<:t*0>.&|y substitute 0 for x > > 0=!.t y if (|y)<:t*|y algebra > > > > So if t<1 (which t is required to be), y must be 0. > > > > See also the essay in the J Wiki: > > http://www.jsoftware.com/jwiki/Essays/Tolerant_Comparison > > which among other things demonstrates that t>:1 gives > > nonsense results. > > > > > > > > ----- Original Message ----- > > From: "Oleg Kobchenko" <[EMAIL PROTECTED]> > > To: "Programming forum" <[email protected]> > > Sent: Sunday, May 28, 2006 10:08 PM > > Subject: [Jprogramming] Equal tolerance fit conjunction -- again > > > > I need to compare floats (complex) with more lenient > > tolerance, that is numbers a bit farther apart would > > return equal. > > > > In particular, I need to compare with 0, so that > > for 0e_11 it returns 1 and for 0e_9 it returns 0. > > > > >From the dictionary, > > http://www.jsoftware.com/books/help/dictionary/d000.htm > > "comparison is made with a tolerance t , normally 2 to > > the power _44". But > > > > 0 = 2^_44 > > 0 > > 0 = 2^_60 > > 0 > > 0 = 2^_20 > > 0 > > > > So how does this example relate to the rule above? > > > > It continues, "but also controlled by the fit conjunction !. , > > as in x=!.0 y . Formally, x=y is 1 if the magnitude of x-y does > > not exceed t times the larger of the magnitudes of x and y ." > > > > With zero and positive x we have > > > > (|x-0) <: t*x > > x <: t*x > > 1 <: t > > > > This doesn't make sense. Can I compare tolerantly > > with zero at all? > > > __________________________________________________ > Do You Yahoo!? > Tired of spam? Yahoo! Mail has the best spam protection around > http://mail.yahoo.com > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
