![]() |
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 |
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 |
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(); } |
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(); } |
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 |
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 |
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 |
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(); } |
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) |
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 07:15 PM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.