Re: comparing doubles for equality



Jens Thoms Toerring wrote:
Richard Weeks <rweeks@xxxxxxxxxx> wrote:

After some hair pulling over the issue of comparing doubles for equality, I came up with this solution based on the notion of relative difference. I'd appreciate your comments.


#define MAXRELDIFF .000000000001


/* compare doubles for equality. First compare
integer parts; if they are unequal, return
false. If they are equal, calculate relative
difference of fractional parts and compare
it to a tolerance. */
int dbl_isequal(double a, double b)
{
double fraca, fracb, reldiff;
if((int)a == (int)b)


This probably will fail for numbers that can't be represented as
integers, e.g. for numbers like the numbers in the order of the
number of particles in one Mol of a substance which is ca. 6e23
and probably not an uncommon number in scientific calculations.
But on many systems such a number (or just the national debt of
some countries;-) won't fit into an int (or even a long int)

In which case standard C (without extended precision routines) will be inadequate for the calculations anyway.

What about something like this:

int dbl_is_nearly_equal( double a, double b )
{
double max_of_both = fsbs( a ) > fabs( b ) ? a : b;
if ( max_of_both == 0.0 )
return 1;
return fabs( ( a - b ) / max_of_both ) < DBL_EPSILON;
}

Of course you can pick a larger relative difference than
DBL_EPSILON (but a smaller won't make much sense).

I guess I will go with this Jens, and resign myself to the lack of a general solution to this problem.

Richard
.



Relevant Pages

  • Re: comparing doubles for equality
    ... equality, I came up with this solution based on the notion of ... relative difference. ... This probably will fail for numbers that can't be represented as ... some countries;-) won't fit into an int ...
    (comp.programming)
  • Re: comparing doubles for equality
    ... double fraca, fracb, reldiff; ... some countries;-) won't fit into an int ... useful to calculate the relative difference separately. ...
    (comp.programming)
  • Re: What does this function return!
    ... Jens Thoms Toerring skrev: ... If you call the function with 'bitnumber' ... needed at all (and it actually should also be an unsigned int), ...
    (comp.lang.c)
  • Re: format for declaring variables?
    ... At about the time of 2/9/2007 1:43 AM, Jens Thoms Toerring stated the ... int main ... char *p; ... Alot of my code uses the first form. ...
    (comp.lang.c)
  • Re: Bus error--not sure why
    ... jt@xxxxxxxxxxx (Jens Thoms Toerring) writes: ... (This is reallt to the OP, but it builds on all the correct things ... int main { ... All that is needed is a loop with your sprintf as ...
    (comp.lang.c)