checking for close enough floating point values.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • pereges

    checking for close enough floating point values.

    Let's say I have two doubles:

    double a, b;

    a = 9.3567891003459 2
    b = 9.3567892560233 4

    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)
    ....

  • vippstar@gmail.com

    #2
    Re: checking for close enough floating point values.

    On May 29, 8:30 pm, pereges <Brol...@gmail. comwrote:
    Let's say I have two doubles:
    >
    double a, b;
    >
    a = 9.3567891003459 2
    b = 9.3567892560233 4
    >
    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/>

    Comment

    • Barry Schwarz

      #3
      Re: checking for close enough floating point values.

      On Thu, 29 May 2008 10:30:49 -0700 (PDT), pereges <Broli00@gmail. com>
      wrote:
      >Let's say I have two doubles:
      >
      >double a, b;
      >
      >a = 9.3567891003459 2
      >b = 9.3567892560233 4
      >
      >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

      Comment

      • pereges

        #4
        Re: checking for close enough floating point values.

        On May 30, 9:52 am, Barry Schwarz <schwa...@dqel. comwrote:
        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.

        Comment

        • pereges

          #5
          Re: checking for close enough floating point values.

          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))

          Comment

          • Bartc

            #6
            Re: checking for close enough floating point values.


            "Barry Schwarz" <schwarzb@dqel. comwrote in message
            news:inku34935b b3u8akoohq73ffc 3jnvj02e7@4ax.c om...
            On Thu, 29 May 2008 10:30:49 -0700 (PDT), pereges <Broli00@gmail. com>
            wrote:
            >
            >>Let's say I have two doubles:
            >>
            >>double a, b;
            >>
            >>a = 9.3567891003459 2
            >>b = 9.3567892560233 4
            >>
            >>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


            Comment

            • Barry Schwarz

              #7
              Re: checking for close enough floating point values.

              On Fri, 30 May 2008 02:07:53 -0700 (PDT), pereges <Broli00@gmail. com>
              wrote:
              >On May 30, 9:52 am, Barry Schwarz <schwa...@dqel. comwrote:
              >
              >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

              Comment

              Working...