Re: Using Equal with Real Numbers
- To: mathgroup at smc.vnet.net
- Subject: [mg123167] Re: Using Equal with Real Numbers
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Fri, 25 Nov 2011 04:55:24 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201111241153.GAA28857@smc.vnet.net>
- Reply-to: drmajorbob at yahoo.com
> (This actually depends on the OS and perhaps other things). The point is > that he recognizes 0.6 as a member of list1 but not 0.7, even though > both have the same InputForms. The point is that they do NOT have the same InputForm, as your own outputs show. For flexibility, I suggest something like Clear[memberQ] memberQ[tol_][list_List, x_] := Cases[list, y_ /; Abs[x - y] < tol, {1}, 1] != {} list1 = Range[0, 1, 0.1]; memberQ[10^-6][list1, #] & /@ {0.6, 0.7} {True, True} or Clear[memberQ] memberQ[tol_][list_List, x_] := MemberQ[Unitize[list - x, tol], 0] list1 = Range[0, 1, 0.1]; memberQ[10^-6][list1, #] & /@ {0.6, 0.7} {True, True} I think one of those will be pretty fast. Bobby On Thu, 24 Nov 2011 05:53:28 -0600, Gabriel Landi <gtlandi at gmail.com> wrote: > Dear MathGroup members, > > Using statements like x1=x2, with real numbers is problematic in > most programming languages. > Below I briefly discuss an example with Mathematica and then show the > rather truculent solution that I've come up with. > I would love to hear your comments on this and perhaps other (likely > better) solutions. > > Best Regards, > > Gabriel Landi > > > -------------------------------------------------------------------------- > -------------------------------------------------------------------------- > -------------------------------------------------------------------------- > --- > > Consider: > > In[187]:= list1 = Range[0, 1, 0.1] > Out[187]= {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.} > > Using InputForm we see that: > > In[188]:= list1 // InputForm > > Out[188]//InputForm={0., 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, > 0.6000000000000001, 0.7000000000000001, > 0.8, 0.9, 1.} > > That is, 0.3, 0.6 and 0.7 have some round-off error. > > Now: > > In[200]:= {MemberQ[list1, 0.6], MemberQ[list1, 0.7]} > Out[200]= {True, False} > > (This actually depends on the OS and perhaps other things). The point is > that he recognizes 0.6 as a member of list1 but not 0.7, even though > both have the same InputForms. > This issue, as you may imagine, prohibits one from using functions that > implicitly make use of =, when dealing with real numbers. > > Here is my solution: > > range[xi_, xf_, df_] := N@Rationalize@Range[xi, xf, df] > > That is, I redefine the range function. It first rationalizes the > entries and then transform them into numeric quantities. Not only is > this crude, but is likely quite slow for long lists. Notwithstanding, it > does solve the problem in the previous example: > > In[190]:= list2 = range[0, 1, 0.1] > Out[190]= {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.} > > In[191]:= list2 // InputForm > Out[191]//InputForm= {0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, > 1.} > > In[201]:= {MemberQ[list2, 0.6], MemberQ[list2, 0.7]} > Out[201]= {True, True} > > > -- DrMajorBob at yahoo.com
- References:
- Using Equal with Real Numbers
- From: Gabriel Landi <gtlandi@gmail.com>
- Using Equal with Real Numbers