> 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