> 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