Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   how to check a double is inf or NaN? (http://www.velocityreviews.com/forums/t459827-how-to-check-a-double-is-inf-or-nan.html)

zl2k 01-15-2007 05:46 AM

how to check a double is inf or NaN?
 
hi,
Can someone let me know the command to check if a value is inf or NaN
in c++? I am using gcc in linux. Thanks for help.
zl2k


Ivan Novick 01-15-2007 05:52 AM

Re: how to check a double is inf or NaN?
 

zl2k wrote:
> Can someone let me know the command to check if a value is inf or NaN
> in c++? I am using gcc in linux. Thanks for help.


man isnan

-----
Ivan
http://www.0x4849.net


Ondra Holub 01-15-2007 10:12 AM

Re: how to check a double is inf or NaN?
 

zl2k napsal:
> hi,
> Can someone let me know the command to check if a value is inf or NaN
> in c++? I am using gcc in linux. Thanks for help.
> zl2k


NaN is the only value, for which is expression value == value always
false. So:

template<typename T>
inline bool isnan(T value)
{
return value != value;
}

// requires #include <limits>
template<typename T>
inline bool isinf(T value)
{
return std::numeric_limits<T>::has_infinity() &&
value == std::numeric_limits<T>::infinity();
}


Ondra Holub 01-15-2007 10:18 AM

Re: how to check a double is inf or NaN?
 

Ondra Holub napsal:
> zl2k napsal:
> > hi,
> > Can someone let me know the command to check if a value is inf or NaN
> > in c++? I am using gcc in linux. Thanks for help.
> > zl2k

>
> NaN is the only value, for which is expression value == value always
> false. So:
>
> template<typename T>
> inline bool isnan(T value)
> {
> return value != value;
> }
>
> // requires #include <limits>
> template<typename T>
> inline bool isinf(T value)
> {
> return std::numeric_limits<T>::has_infinity() &&
> value == std::numeric_limits<T>::infinity();
> }


Small correction of posted code (has_infinity is not function, so
parentheses are removed):

template<typename T>
inline bool isnan(T value)
{
return value != value;

}

// requires #include <limits>
template<typename T>
inline bool isinf(T value)
{
return std::numeric_limits<T>::has_infinity &&
value == std::numeric_limits<T>::infinity();
}


Greg 01-15-2007 03:02 PM

Re: how to check a double is inf or NaN?
 
Ondra Holub wrote:
> Ondra Holub napsal:
> > zl2k napsal:
> > > hi,
> > > Can someone let me know the command to check if a value is inf or NaN
> > > in c++? I am using gcc in linux. Thanks for help.
> > > zl2k

> template<typename T>
> inline bool isnan(T value)
> {
> return value != value;
>
> }
>
> // requires #include <limits>
> template<typename T>
> inline bool isinf(T value)
> {
> return std::numeric_limits<T>::has_infinity &&
> value == std::numeric_limits<T>::infinity();
> }


Why not:

#include <cmath>

...
if ( std::isinf( value ))
{
// value is infinity
}

if ( std::isnan( value ))
{
// value is not a number
}

Greg


Greg 01-15-2007 03:12 PM

Re: how to check a double is inf or NaN?
 

Ondra Holub wrote:
> Ondra Holub napsal:
> > zl2k napsal:
> > > hi,
> > > Can someone let me know the command to check if a value is inf or NaN
> > > in c++? I am using gcc in linux. Thanks for help.
> > > zl2k

> >
> > // requires #include <limits>
> > template<typename T>
> > inline bool isinf(T value)
> > {
> > return std::numeric_limits<T>::has_infinity() &&
> > value == std::numeric_limits<T>::infinity();
> > }


This implementation of isinf() incorrectly returns false when value is
equal to negative infinity.

Greg


Ondra Holub 01-16-2007 09:49 AM

Re: how to check a double is inf or NaN?
 

Greg napsal:
> Ondra Holub wrote:
> > Ondra Holub napsal:
> > > zl2k napsal:
> > > > hi,
> > > > Can someone let me know the command to check if a value is inf or NaN
> > > > in c++? I am using gcc in linux. Thanks for help.
> > > > zl2k

> > template<typename T>
> > inline bool isnan(T value)
> > {
> > return value != value;
> >
> > }
> >
> > // requires #include <limits>
> > template<typename T>
> > inline bool isinf(T value)
> > {
> > return std::numeric_limits<T>::has_infinity &&
> > value == std::numeric_limits<T>::infinity();
> > }

>
> Why not:
>
> #include <cmath>
>
> ...
> if ( std::isinf( value ))
> {
> // value is infinity
> }
>
> if ( std::isnan( value ))
> {
> // value is not a number
> }
>
> Greg


isnan is part of C99 standard. It is not required in current C++
standard (because it is from 1998). Although many compilers support it,
it is not 100% portable. See
http://www.parashift.com/c++-faq-lit...html#faq-29.15


Ondra Holub 01-16-2007 09:53 AM

Re: how to check a double is inf or NaN?
 
Greg napsal:
> Ondra Holub wrote:
> > Ondra Holub napsal:
> > > zl2k napsal:
> > > > hi,
> > > > Can someone let me know the command to check if a value is inf or NaN
> > > > in c++? I am using gcc in linux. Thanks for help.
> > > > zl2k
> > >
> > > // requires #include <limits>
> > > template<typename T>
> > > inline bool isinf(T value)
> > > {
> > > return std::numeric_limits<T>::has_infinity() &&
> > > value == std::numeric_limits<T>::infinity();
> > > }

>
> This implementation of isinf() incorrectly returns false when value is
> equal to negative infinity.
>
> Greg


Question was, how to check for infinity (which I understand positive
infinity as 1 is understand +1), not how to check for positive or
negative infinity. Of course, it does not detect -inf. If there is
necessary to detect any infinity, it may be done for example this way:

#include <limits>
template<typename T>
inline bool isanyinf(T value)
{
return value >= std::numeric_limits<T>::min() && value <=
std::numeric_limits<T>::max();
}


Pete Becker 01-16-2007 12:01 PM

Re: how to check a double is inf or NaN?
 
Ondra Holub wrote:
>
> isnan is part of C99 standard. It is not required in current C++
> standard (because it is from 1998). Although many compilers support it,
> it is not 100% portable. See


The current C++ standard is from 2003, a technical revision of the 1998
standard.

isnan is part of TR1, and has been incorporated into the working draft
for C++0x.

--

-- Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com)
Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." (www.petebecker.com/tr1book)

Greg 01-16-2007 01:52 PM

Re: how to check a double is inf or NaN?
 
Ondra Holub wrote:
> Greg napsal:
> > Ondra Holub wrote:
> > > Ondra Holub napsal:
> > > > zl2k napsal:
> > > > > hi,
> > > > > Can someone let me know the command to check if a value is inf or NaN
> > > > > in c++? I am using gcc in linux. Thanks for help.
> > > > > zl2k
> > > >
> > > > // requires #include <limits>
> > > > template<typename T>
> > > > inline bool isinf(T value)
> > > > {
> > > > return std::numeric_limits<T>::has_infinity() &&
> > > > value == std::numeric_limits<T>::infinity();
> > > > }

> >
> > This implementation of isinf() incorrectly returns false when value is
> > equal to negative infinity.

>
> Question was, how to check for infinity (which I understand positive
> infinity as 1 is understand +1), not how to check for positive or
> negative infinity.


The standard routine, isinf() in <math.h> tests for whether its
argument has an infinite value. Therefore isinf() returns true when
called with either positive or negative infinity, because both are
infinite values.

Implementing another isinf() function that performs a similar, but
different test, would just cause confusion - at best. A programmer
would have to make sure which isinf() is being called in a particular
fil - just to know what its return value means.

Greg



All times are GMT. The time now is 12:36 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.