Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > checking for close enough floating point values.

Reply
Thread Tools

checking for close enough floating point values.

 
 
pereges
Guest
Posts: n/a
 
      05-29-2008
Let's say I have two doubles:

double a, b;

a = 9.35678910034592
b = 9.35678925602334

Obviously, a < b but lets say I just want to check up to 6 places
after the decimal. I want to check if the condition a >= b is
satisfied. I have a tolerance value:

#define EPSILON 0.000001

Is this a good way to check for a >= b

if( fabs(a-b) <= EPSILON)
....

 
Reply With Quote
 
 
 
 
vippstar@gmail.com
Guest
Posts: n/a
 
      05-29-2008
On May 29, 8:30 pm, pereges <(E-Mail Removed)> wrote:
> Let's say I have two doubles:
>
> double a, b;
>
> a = 9.35678910034592
> b = 9.35678925602334
>
> Obviously, a < b but lets say I just want to check up to 6 places
> after the decimal. I want to check if the condition a >= b is
> satisfied. I have a tolerance value:
>
> #define EPSILON 0.000001
>
> Is this a good way to check for a >= b
>
> if( fabs(a-b) <= EPSILON)
> ...

Question 14.5 of the C-FAQ.
<http://c-faq.com/>
 
Reply With Quote
 
 
 
 
Walter Roberson
Guest
Posts: n/a
 
      05-29-2008
In article <(E-Mail Removed)>,
pereges <(E-Mail Removed)> wrote:
>Let's say I have two doubles:


>double a, b;


>a = 9.35678910034592
>b = 9.35678925602334


>Obviously, a < b but lets say I just want to check up to 6 places
>after the decimal. I want to check if the condition a >= b is
>satisfied. I have a tolerance value:


>#define EPSILON 0.000001


>Is this a good way to check for a >= b


>if( fabs(a-b) <= EPSILON)
>...


That is a typical way to check whether values are "close enough"
to being equal.

However, you should be aware that this is -not- a test for
equality up to the 6th decimal place. There is no exact representation
for 0.000001 in binary floating point arithmetic, so chances
are that instead if you use that EPSILON, what you will end up doing is
checking whether they are equal to within
9.999999999999999547481118258862586856139387236908 07819366455078125e-07

That's a number slightly less than 0.000001. This could make a difference
if your a and b values were (for example) on the order of .00009 themselves.

--
"Beauty, like all other qualities presented to human experience,
is relative; and the definition of it becomes unmeaning and
useless in proportion to its abstractness." -- Walter Pater
 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      05-30-2008
On Thu, 29 May 2008 10:30:49 -0700 (PDT), pereges <(E-Mail Removed)>
wrote:

>Let's say I have two doubles:
>
>double a, b;
>
>a = 9.35678910034592
>b = 9.35678925602334
>
>Obviously, a < b but lets say I just want to check up to 6 places
>after the decimal. I want to check if the condition a >= b is
>satisfied. I have a tolerance value:
>
>#define EPSILON 0.000001
>
>Is this a good way to check for a >= b
>
>if( fabs(a-b) <= EPSILON)
>...


This checks for a == b, not a >= b.

if (a + EPSILON >= b) would be the corresponding check for >=.

However, you should read 14.5 in the c-faq (www.c-faq.com) to see why
an unscaled EPSILON is a bad idea.


Remove del for email
 
Reply With Quote
 
pereges
Guest
Posts: n/a
 
      05-30-2008
On May 30, 9:52 am, Barry Schwarz <(E-Mail Removed)> wrote:

> This checks for a == b, not a >= b.
>
> if (a + EPSILON >= b) would be the corresponding check for >=.
>
> However, you should read 14.5 in the c-faq (www.c-faq.com) to see why
> an unscaled EPSILON is a bad idea.


So do you think it will be better to use the relative difference
method as suggested in the C faq 14.5 ?

#define Abs(x) ((x) < 0 ? -(x) : (x))
#define Max(a, b) ((a) > (b) ? (a) : (b))

double RelDif(double a, double b)
{
double c = Abs(a);
double d = Abs(b);

d = Max(c, d);

return d == 0.0 ? 0.0 : Abs(a - b) / d;
}


....
to check for a >= b,

if(RelDif(a, b) <= TOLERANCE || a > b)
...

Btw the floating point data that I'm reading has 6 places after the
decimal point so I though I would take a tolerance value of 0.000001.
 
Reply With Quote
 
pereges
Guest
Posts: n/a
 
      05-30-2008
I don't know why a seperate macro has been written for finding
absolute value. Was it not possible to use fabs() ?

#define Abs(x) ((x) < 0 ? -(x) : (x))
 
Reply With Quote
 
Bartc
Guest
Posts: n/a
 
      05-30-2008

"Barry Schwarz" <(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> On Thu, 29 May 2008 10:30:49 -0700 (PDT), pereges <(E-Mail Removed)>
> wrote:
>
>>Let's say I have two doubles:
>>
>>double a, b;
>>
>>a = 9.35678910034592
>>b = 9.35678925602334
>>
>>Obviously, a < b but lets say I just want to check up to 6 places
>>after the decimal. I want to check if the condition a >= b is
>>satisfied. I have a tolerance value:
>>
>>#define EPSILON 0.000001
>>
>>Is this a good way to check for a >= b
>>
>>if( fabs(a-b) <= EPSILON)
>>...

>
> This checks for a == b, not a >= b.
>
> if (a + EPSILON >= b) would be the corresponding check for >=.


What about:

if ( a>b || (fabs(a-b)<=EPSILON) )

for a>=b ? This would be faster when a is normally expected to be greater
than b.

--
Bartc


 
Reply With Quote
 
Barry Schwarz
Guest
Posts: n/a
 
      05-31-2008
On Fri, 30 May 2008 02:07:53 -0700 (PDT), pereges <(E-Mail Removed)>
wrote:

>On May 30, 9:52 am, Barry Schwarz <(E-Mail Removed)> wrote:
>
>> This checks for a == b, not a >= b.
>>
>> if (a + EPSILON >= b) would be the corresponding check for >=.
>>
>> However, you should read 14.5 in the c-faq (www.c-faq.com) to see why
>> an unscaled EPSILON is a bad idea.

>
>So do you think it will be better to use the relative difference
>method as suggested in the C faq 14.5 ?
>


snip

>Btw the floating point data that I'm reading has 6 places after the
>decimal point so I though I would take a tolerance value of 0.000001.


If you can guarantee that all the data will be within a certain range
then you don't need to scale based on the current value. But what
happens when one set of values is near 1e-6 and another is near 1e10?
That is the point I thought the faq was trying to make.


Remove del for email
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Share-Point-2010 ,Share-Point -2010 Training , Share-point-2010Hyderabad , Share-point-2010 Institute Saraswati lakki ASP .Net 0 01-06-2012 06:39 AM
Writing a macro for checking close enough floating points. pereges C Programming 3 07-23-2008 03:37 PM
Writing a macro for checking close enough floating points. pereges C Programming 8 07-22-2008 01:32 PM
Checking for invalid floating point numbers LSW C++ 3 06-08-2007 05:20 PM
floating point problem... floating indeed :( teeshift Ruby 2 12-01-2006 01:16 AM



Advertisments