Bug in my own method :(

def =~( other )
  epsilon_eql?(coerce(other)[0], EPSILON)
end

<sigh> it's definitely a Friday

TwP


On 7/7/06, Tim Pease <tim.pease / gmail.com> wrote:
> > On 7/7/06, Martin DeMello <martindemello / gmail.com> wrote:
> >
> > This is ugly, because Float#== is a two-argument method that you're
> > faking with one argument and one global constant. An array argument
> > might be a nice piece of syntactic sugar, though I'd still prefer to
> > overload =~ instead, e.g. a =~ [b, epsilon] with a =~ b defaulting to
> > Float::EPSILON.
> >
> > Also, note that your method definition needs to be
> >
> > def =~ (o); ((o - self)/o).abs <= EPSILON; end
> >
> > you want relative, not absolute, error margins.
> >
> > martin
> >
>
> Martin, I like the syntax.  To make it more like Float#==
>
> class Float
>   def =~( other )
>     epsilon_eql?(coerce(other), EPSILON)
>   end
>
>   def epsilon_eql?( other, epsilon )
>     return false unless other.instance_of? self.class
>     ((other-self)/other).abs <= epsilon
>   end
> end
>
> I think this gives the best of both worlds.  A simple =~ syntax for
> using the default epsilon, and the slightly less elegant epsilon_eql?
> syntax when you want to sepcify your own.
>
> Blessings,
> TwP
>
>