comparing doubles for equality



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)
{
fraca = a - (int)a;
fracb = b - (int)b;
reldiff = rel_diff(fraca, fracb);
if(reldiff > MAXRELDIFF) return 0;
else return 1;
}
return 0;
}

double rel_diff(double a, double b)
{
double c, d;
c = fabs(a);
d = fabs(b);
c > d ? c : d;
return d == 0.0 ? 0.0 : fabs(a - b) / d;
}

I broke it down into two functions because I thought it might be useful to calculate the relative difference separately. And yes, I know that C99 introduced a boolean type.

Richard
.



Relevant Pages

  • Re: comparing doubles for equality
    ... 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. ...
    (comp.programming)
  • Re: comparing doubles for equality
    ... equality, I came up with this solution based on the notion of relative difference. ... /* compare doubles for equality. ... double fraca, fracb, reldiff; ...
    (comp.programming)