MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

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}





  • Prev by Date: Re: Piecewise bug in Mathematica 8.01?
  • Next by Date: Re: Aligning 2 Sets of Axes at {0,0}; Rotated & Standard Position
  • Previous by thread: Re: Non trivial substitution in a very long output
  • Next by thread: Re: Using Equal with Real Numbers