Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > How to check if a double is near an int?

Reply
Thread Tools

How to check if a double is near an int?

 
 
xz
Guest
Posts: n/a
 
      04-23-2008
In a program, if a double is within 0.0001 from an int, then I treat
it as int. For example, 10.00005 will be treated as int, while 10.001
is not.

I am looking for an algorithm to implement this checking. Anybody
gives an idea?

Thanks.
 
Reply With Quote
 
 
 
 
Christopher
Guest
Posts: n/a
 
      04-23-2008
On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:
> In a program, if a double is within 0.0001 from an int, then I treat
> it as int. For example, 10.00005 will be treated as int, while 10.001
> is not.
>
> I am looking for an algorithm to implement this checking. Anybody
> gives an idea?
>
> Thanks.


Depends what you mean by "treat it as"

Surely the math is simple enough to grab to decimal portion of the
double and compare it to .0001 or any variable amount you wish.
Getting the quotient and remainder after dividing by 1 comes to mind.
I doubt I'd even call it an algorithm...
 
Reply With Quote
 
 
 
 
xz
Guest
Posts: n/a
 
      04-23-2008
On Apr 23, 5:05 pm, Christopher <cp...@austin.rr.com> wrote:
> On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:
>
> > In a program, if a double is within 0.0001 from an int, then I treat
> > it as int. For example, 10.00005 will be treated as int, while 10.001
> > is not.

>
> > I am looking for an algorithm to implement this checking. Anybody
> > gives an idea?

>
> > Thanks.

>
> Depends what you mean by "treat it as"
>
> Surely the math is simple enough to grab to decimal portion of the
> double and compare it to .0001 or any variable amount you wish.
> Getting the quotient and remainder after dividing by 1 comes to mind.
> I doubt I'd even call it an algorithm...


By "treat it as" I mean I will do different things for the doubles
near int and for the doubles not near int.

Your trick (if you don't wanna call it algorithm) does not really work
for my case because I wanna 9.99999 to be "near int" however its
decimal portion is 0.99999.




 
Reply With Quote
 
Christopher
Guest
Posts: n/a
 
      04-23-2008
On Apr 23, 5:15 pm, xz <zhang.xi...@gmail.com> wrote:
> On Apr 23, 5:05 pm, Christopher <cp...@austin.rr.com> wrote:
>
>
>
> > On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:

>
> > > In a program, if a double is within 0.0001 from an int, then I treat
> > > it as int. For example, 10.00005 will be treated as int, while 10.001
> > > is not.

>
> > > I am looking for an algorithm to implement this checking. Anybody
> > > gives an idea?

>
> > > Thanks.

>
> > Depends what you mean by "treat it as"

>
> > Surely the math is simple enough to grab to decimal portion of the
> > double and compare it to .0001 or any variable amount you wish.
> > Getting the quotient and remainder after dividing by 1 comes to mind.
> > I doubt I'd even call it an algorithm...

>
> By "treat it as" I mean I will do different things for the doubles
> near int and for the doubles not near int.


Well, that certainly sheds some light on things. "treat it as" means
"do different things"....hmmm
Pretty hard to help you when you won't describe what you are trying to
do.


> Your trick (if you don't wanna call it algorithm) does not really work
> for my case because I wanna 9.99999 to be "near int" however its
> decimal portion is 0.99999.


Still the same principle:

if( remainder - tolerance < 0.0 )
{
// Do whatever you mean by treat as int and round down if you wish
}
else if( remainder + tolerance > 1.0 )
{
// Do whatever you mean by treat as int and round up if you wish
}

 
Reply With Quote
 
Thomas Austad
Guest
Posts: n/a
 
      04-23-2008
Are you looking for a "algorithm" like this then?

bool isNearInt( double value )
{
const double epsilon = 0.0001;
const double diff = value - floor( value );
return ( diff <= epsilon || diff >= (1.0 - epsilon) );
}

which should at least answer the within epsilon of an integer value.


xz wrote:
> On Apr 23, 5:05 pm, Christopher <cp...@austin.rr.com> wrote:
>> On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:
>>
>>> In a program, if a double is within 0.0001 from an int, then I treat
>>> it as int. For example, 10.00005 will be treated as int, while 10.001
>>> is not.
>>> I am looking for an algorithm to implement this checking. Anybody
>>> gives an idea?
>>> Thanks.

>> Depends what you mean by "treat it as"
>>
>> Surely the math is simple enough to grab to decimal portion of the
>> double and compare it to .0001 or any variable amount you wish.
>> Getting the quotient and remainder after dividing by 1 comes to mind.
>> I doubt I'd even call it an algorithm...

>
> By "treat it as" I mean I will do different things for the doubles
> near int and for the doubles not near int.
>
> Your trick (if you don't wanna call it algorithm) does not really work
> for my case because I wanna 9.99999 to be "near int" however its
> decimal portion is 0.99999.
>
>
>
>

 
Reply With Quote
 
xz
Guest
Posts: n/a
 
      04-23-2008
On Apr 23, 5:35 pm, Christopher <cp...@austin.rr.com> wrote:
> On Apr 23, 5:15 pm, xz <zhang.xi...@gmail.com> wrote:
>
>
>
> > On Apr 23, 5:05 pm, Christopher <cp...@austin.rr.com> wrote:

>
> > > On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:

>
> > > > In a program, if a double is within 0.0001 from an int, then I treat
> > > > it as int. For example, 10.00005 will be treated as int, while 10.001
> > > > is not.

>
> > > > I am looking for an algorithm to implement this checking. Anybody
> > > > gives an idea?

>
> > > > Thanks.

>
> > > Depends what you mean by "treat it as"

>
> > > Surely the math is simple enough to grab to decimal portion of the
> > > double and compare it to .0001 or any variable amount you wish.
> > > Getting the quotient and remainder after dividing by 1 comes to mind.
> > > I doubt I'd even call it an algorithm...

>
> > By "treat it as" I mean I will do different things for the doubles
> > near int and for the doubles not near int.

>
> Well, that certainly sheds some light on things. "treat it as" means
> "do different things"....hmmm
> Pretty hard to help you when you won't describe what you are trying to
> do.


Sorry about not having expressed it clearly and thanks for your help.

>
> > Your trick (if you don't wanna call it algorithm) does not really work
> > for my case because I wanna 9.99999 to be "near int" however its
> > decimal portion is 0.99999.

>
> Still the same principle:
>
> if( remainder - tolerance < 0.0 )
> {
> // Do whatever you mean by treat as int and round down if you wish}
>
> else if( remainder + tolerance > 1.0 )
> {
> // Do whatever you mean by treat as int and round up if you wish
>
> }


However, this is like a brutal force way that I actually thought
about.
I am wondering if there is any smarter way to do that? Like finishing
the job in a relatively simple expression?
Still appreciate a lot for your help.

 
Reply With Quote
 
dp1978x@gmail.com
Guest
Posts: n/a
 
      04-23-2008
On Apr 23, 5:56 pm, xz <zhang.xi...@gmail.com> wrote:
> In a program, if a double is within 0.0001 from an int, then I treat
> it as int. For example, 10.00005 will be treated as int, while 10.001
> is not.
>
> I am looking for an algorithm to implement this checking. Anybody
> gives an idea?
>
> Thanks.


Something like this? but see also http://www.parashift.com/c++-faq-lit...html#faq-29.17

bool close_to_int (double d, double tolerance) {
double cdiff = std::fabs (std::ceil (d) - d);
double fdiff = std::fabs (std::floor (d) - d);
if (cdiff < fdiff)
return cdiff <= tolerance;
return fdiff <= tolerance;
}

 
Reply With Quote
 
Thomas J. Gritzan
Guest
Posts: n/a
 
      04-23-2008
xz wrote:
> On Apr 23, 5:05 pm, Christopher <cp...@austin.rr.com> wrote:
>> On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:
>>
>>> In a program, if a double is within 0.0001 from an int, then I treat
>>> it as int. For example, 10.00005 will be treated as int, while 10.001
>>> is not.
>>> I am looking for an algorithm to implement this checking. Anybody
>>> gives an idea?
>>> Thanks.

>> Depends what you mean by "treat it as"
>>
>> Surely the math is simple enough to grab to decimal portion of the
>> double and compare it to .0001 or any variable amount you wish.
>> Getting the quotient and remainder after dividing by 1 comes to mind.
>> I doubt I'd even call it an algorithm...

>
> By "treat it as" I mean I will do different things for the doubles
> near int and for the doubles not near int.
>
> Your trick (if you don't wanna call it algorithm) does not really work
> for my case because I wanna 9.99999 to be "near int" however its
> decimal portion is 0.99999.


Given:
#include <cmath>
const double eps = 0.0001; // your treshold
double d = 10.00005; // your number

The algorithm would be:
1. Round d to nearest integer.
2. Check if nearest integer is within treshold.

double near = std::floor(d+0.5);
if (std::abs(d - near) < eps) {
int i = near;
// use i or near
}
else
{
// use d
}

--
Thomas
 
Reply With Quote
 
xz
Guest
Posts: n/a
 
      04-24-2008
On Apr 23, 5:48 pm, "Thomas J. Gritzan" <phygon_antis...@gmx.de>
wrote:
> xz wrote:
> > On Apr 23, 5:05 pm, Christopher <cp...@austin.rr.com> wrote:
> >> On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:

>
> >>> In a program, if a double is within 0.0001 from an int, then I treat
> >>> it as int. For example, 10.00005 will be treated as int, while 10.001
> >>> is not.
> >>> I am looking for an algorithm to implement this checking. Anybody
> >>> gives an idea?
> >>> Thanks.
> >> Depends what you mean by "treat it as"

>
> >> Surely the math is simple enough to grab to decimal portion of the
> >> double and compare it to .0001 or any variable amount you wish.
> >> Getting the quotient and remainder after dividing by 1 comes to mind.
> >> I doubt I'd even call it an algorithm...

>
> > By "treat it as" I mean I will do different things for the doubles
> > near int and for the doubles not near int.

>
> > Your trick (if you don't wanna call it algorithm) does not really work
> > for my case because I wanna 9.99999 to be "near int" however its
> > decimal portion is 0.99999.

>
> Given:
> #include <cmath>
> const double eps = 0.0001; // your treshold
> double d = 10.00005; // your number
>
> The algorithm would be:
> 1. Round d to nearest integer.
> 2. Check if nearest integer is within treshold.
>
> double near = std::floor(d+0.5);
> if (std::abs(d - near) < eps) {
> int i = near;
> // use i or near}
>
> else
> {
> // use d
>
> }
>
> --
> Thomas



+0.5!

That's smart! Exactly what I wanted!

Thanks a lot!
 
Reply With Quote
 
xz
Guest
Posts: n/a
 
      04-24-2008
On Apr 23, 5:48 pm, "Thomas J. Gritzan" <phygon_antis...@gmx.de>
wrote:
> xz wrote:
> > On Apr 23, 5:05 pm, Christopher <cp...@austin.rr.com> wrote:
> >> On Apr 23, 4:56 pm, xz <zhang.xi...@gmail.com> wrote:

>
> >>> In a program, if a double is within 0.0001 from an int, then I treat
> >>> it as int. For example, 10.00005 will be treated as int, while 10.001
> >>> is not.
> >>> I am looking for an algorithm to implement this checking. Anybody
> >>> gives an idea?
> >>> Thanks.
> >> Depends what you mean by "treat it as"

>
> >> Surely the math is simple enough to grab to decimal portion of the
> >> double and compare it to .0001 or any variable amount you wish.
> >> Getting the quotient and remainder after dividing by 1 comes to mind.
> >> I doubt I'd even call it an algorithm...

>
> > By "treat it as" I mean I will do different things for the doubles
> > near int and for the doubles not near int.

>
> > Your trick (if you don't wanna call it algorithm) does not really work
> > for my case because I wanna 9.99999 to be "near int" however its
> > decimal portion is 0.99999.

>
> Given:
> #include <cmath>
> const double eps = 0.0001; // your treshold
> double d = 10.00005; // your number
>
> The algorithm would be:
> 1. Round d to nearest integer.
> 2. Check if nearest integer is within treshold.
>
> double near = std::floor(d+0.5);
> if (std::abs(d - near) < eps) {


I guess you meant fabs(...), right?

> int i = near;
> // use i or near}
>
> else
> {
> // use d
>
> }
>
> --
> Thomas


 
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
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
ctime double double check aisling.cronin@gmail.com C Programming 11 03-09-2007 10:39 PM
from List <double> to double[] Web learner ASP .Net 3 04-26-2006 05:26 PM
cannot convert parameter from 'double (double)' to 'double (__cdecl *)(double)' error Sydex C++ 12 02-17-2005 06:30 PM
Double double display display problem problem Tom Accuosti Firefox 3 09-27-2004 10:02 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57