Using Equal with Real Numbers
- To: mathgroup at smc.vnet.net
- Subject: [mg123115] Using Equal with Real Numbers
- From: Gabriel Landi <gtlandi at gmail.com>
- Date: Thu, 24 Nov 2011 06:53:28 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
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}
- Follow-Ups:
- Re: Using Equal with Real Numbers
- From: DrMajorBob <btreat1@austin.rr.com>
- Re: Using Equal with Real Numbers
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: Using Equal with Real Numbers