approxEqual() has fooled me for a long time...

dsimcha dsimcha at yahoo.com
Wed Oct 20 06:02:47 PDT 2010


== Quote from Lars T. Kyllingstad (public at kyllingen.NOSPAMnet)'s article
> (This message was originally meant for the Phobos mailing list, but for
> some reason I am currently unable to send messages to it*.  Anyway, it's
> probably worth making others aware of this as well.)
> In my code, and in unittests in particular, I use std.math.approxEqual()
> a lot to check the results of various computations.  If I expect my
> result to be correct to within ten significant digits, say, I'd write
>   assert (approxEqual(result, expected, 1e-10));
> Since results often span several orders of magnitude, I usually don't
> care about the absolute error, so I just leave it unspecified.  So far,
> so good, right?
> NO!
> I just discovered today that the default value for approxEqual's default
> absolute tolerance is 1e-5, and not zero as one would expect.  This
> means that the following, quite unexpectedly, succeeds:
>   assert (approxEqual(1e-10, 1e-20, 0.1));
> This seems completely illogical to me, and I think it should be fixed
> ASAP.  Any objections?
> Changing it to zero turned up fifteen failing unittests in SciD. :(
> -Lars

What about when the values are numbers a tiny bit different than zero, and should
be exactly zero except for a small amount of numerical fuzz?  I think absolute
error needs to be taken into account by default, too.



More information about the Digitalmars-d mailing list