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

Don nospam at nospam.com
Wed Oct 20 08:52:38 PDT 2010


Andrei Alexandrescu wrote:
> On 10/20/10 5:32 CDT, Lars T. Kyllingstad wrote:
>> (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?
> 
> I wonder what would be a sensible default. If the default for absolute 
> error is zero, then you'd have an equally odd behavior for very small 
> numbers (and most notably zero). Essentially nothing would be 
> approximately zero.
> 
> Andrei

I don't think it's possible to have a sensible default for absolute 
tolerance, because you never know what scale is important. You can do a 
default for relative tolerance, because floating point numbers work that 
way (eg, you can say they're equal if they differ in only the last 4 
bits, or if half of the mantissa bits are equal).

I would even think that the acceptable relative error is almost always 
known at compile time, but the absolute error may not be.



More information about the Digitalmars-d mailing list