Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r79438 - in trunk: boost/math/special_functions libs/math/test
From: john_at_[hidden]
Date: 2012-07-12 05:51:33


Author: johnmaddock
Date: 2012-07-12 05:51:32 EDT (Thu, 12 Jul 2012)
New Revision: 79438
URL: http://svn.boost.org/trac/boost/changeset/79438

Log:
Allow fpclassify and friends to be used with integer types via the usual promotion mechanism.
Fixes #6517.
Text files modified:
   trunk/boost/math/special_functions/fpclassify.hpp | 16 ++++++++++------
   trunk/libs/math/test/test_classify.cpp | 28 +++++++++++++++++-----------
   2 files changed, 27 insertions(+), 17 deletions(-)

Modified: trunk/boost/math/special_functions/fpclassify.hpp
==============================================================================
--- trunk/boost/math/special_functions/fpclassify.hpp (original)
+++ trunk/boost/math/special_functions/fpclassify.hpp 2012-07-12 05:51:32 EDT (Thu, 12 Jul 2012)
@@ -249,12 +249,13 @@
 {
    typedef typename detail::fp_traits<T>::type traits;
    typedef typename traits::method method;
+ typedef typename tools::promote_args<T>::type value_type;
 #ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
    if(std::numeric_limits<T>::is_specialized && detail::is_generic_tag_false(static_cast<method*>(0)))
- return detail::fpclassify_imp(t, detail::generic_tag<true>());
- return detail::fpclassify_imp(t, method());
+ return detail::fpclassify_imp(static_cast<value_type>(t), detail::generic_tag<true>());
+ return detail::fpclassify_imp(static_cast<value_type>(t), method());
 #else
- return detail::fpclassify_imp(t, method());
+ return detail::fpclassify_imp(static_cast<value_type>(t), method());
 #endif
 }
 
@@ -312,7 +313,8 @@
    typedef typename detail::fp_traits<T>::type traits;
    typedef typename traits::method method;
    typedef typename boost::is_floating_point<T>::type fp_tag;
- return detail::isfinite_impl(x, method());
+ typedef typename tools::promote_args<T>::type value_type;
+ return detail::isfinite_impl(static_cast<value_type>(x), method());
 }
 
 //------------------------------------------------------------------------------
@@ -371,7 +373,8 @@
    typedef typename detail::fp_traits<T>::type traits;
    typedef typename traits::method method;
    typedef typename boost::is_floating_point<T>::type fp_tag;
- return detail::isnormal_impl(x, method());
+ typedef typename tools::promote_args<T>::type value_type;
+ return detail::isnormal_impl(static_cast<value_type>(x), method());
 }
 
 //------------------------------------------------------------------------------
@@ -448,7 +451,8 @@
    typedef typename detail::fp_traits<T>::type traits;
    typedef typename traits::method method;
    typedef typename boost::is_floating_point<T>::type fp_tag;
- return detail::isinf_impl(x, method());
+ typedef typename tools::promote_args<T>::type value_type;
+ return detail::isinf_impl(static_cast<value_type>(x), method());
 }
 
 //------------------------------------------------------------------------------

Modified: trunk/libs/math/test/test_classify.cpp
==============================================================================
--- trunk/libs/math/test/test_classify.cpp (original)
+++ trunk/libs/math/test/test_classify.cpp 2012-07-12 05:51:32 EDT (Thu, 12 Jul 2012)
@@ -14,7 +14,7 @@
 #include <boost/test/test_exec_monitor.hpp>
 
 #ifdef _MSC_VER
-#pragma warning(disable: 4127) // conditional expression is constant
+#pragma warning(disable: 4127 4146) // conditional expression is constant
 #endif
 
 const char* method_name(const boost::math::detail::native_tag&)
@@ -83,16 +83,19 @@
       BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true);
       BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true);
       t = (std::numeric_limits<T>::min)();
- BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL);
- BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL);
- BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);
- BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);
- BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);
- BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);
- BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);
- BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);
- BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true);
- BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true);
+ if(t != 0)
+ {
+ BOOST_CHECK_EQUAL((::boost::math::fpclassify)(t), (int)FP_NORMAL);
+ BOOST_CHECK_EQUAL((::boost::math::fpclassify)(-t), (int)FP_NORMAL);
+ BOOST_CHECK_EQUAL((::boost::math::isfinite)(t), true);
+ BOOST_CHECK_EQUAL((::boost::math::isfinite)(-t), true);
+ BOOST_CHECK_EQUAL((::boost::math::isinf)(t), false);
+ BOOST_CHECK_EQUAL((::boost::math::isinf)(-t), false);
+ BOOST_CHECK_EQUAL((::boost::math::isnan)(t), false);
+ BOOST_CHECK_EQUAL((::boost::math::isnan)(-t), false);
+ BOOST_CHECK_EQUAL((::boost::math::isnormal)(t), true);
+ BOOST_CHECK_EQUAL((::boost::math::isnormal)(-t), true);
+ }
    }
    if(std::numeric_limits<T>::has_denorm)
    {
@@ -273,6 +276,9 @@
    test_classify((long double)(0), "long double");
    test_classify((boost::math::concepts::real_concept)(0), "real_concept");
 #endif
+ // We should test with integer types as well:
+ test_classify(int(0), "int");
+ test_classify(unsigned(0), "unsigned");
   return 0;
 }
 


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk