
Boris Gubenko wrote:
boost does not have rounding control header file for HP-UX/ia64 and, as a result, numeric_interval library tests fail on this platform with the following #error directive:
"../boost/numeric/interval/hw_rounding.hpp", line 36: error #2035: #error directive: Boost.Numeric.Interval: Please specify rounding control mechanism. # error Boost.Numeric.Interval: Please specify rounding control mechanism. ^
I've created rounding control file and amended hw_rounding.hpp to include it when appropriate -- see below. With these changes, all numeric_interval library tests pass and the change does not cause any regression in boost build and tests.
Can the patch for hw_rounding.hpp below and the new header file be committed to both the HEAD and the RC branch? (I don't have developer privileges in cvs)
Thanks, Boris
Will do but shouldn't the #include of <fenv.h> be outside the namespace declarations? John.
Index: hw_rounding.hpp =================================================================== RCS file: /cvsroot/boost/boost/boost/numeric/interval/hw_rounding.hpp,v retrieving revision 1.8 diff -r1.8 hw_rounding.hpp 27a28,29
#elif defined(ia64) || defined(__ia64) || defined(__ia64__) # include <boost/numeric/interval/detail/ia64_rounding_control.hpp>
boost/numeric/interval/detail/ia64_rounding_control.hpp ======================================================= /* Boost interval/detail/ia64_rounding_control.hpp file * * Copyright 2006 Boris Gubenko * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or * copy at http://www.boost.org/LICENSE_1_0.txt) */
#ifndef BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP #define BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP
#if !defined(ia64) && !defined(__ia64) && !defined(__ia64__) #error This header only works on ia64 CPUs. #endif
#if defined(__HP_aCC)
namespace boost { namespace numeric { namespace interval_lib { namespace detail {
# include <fenv.h>
struct ia64_rounding_control { typedef unsigned int rounding_mode;
static void set_rounding_mode(const rounding_mode& mode) { fesetround(mode); } static void get_rounding_mode(rounding_mode& mode) { mode = fegetround(); }
static void downward() { set_rounding_mode(FE_DOWNWARD); } static void upward() { set_rounding_mode(FE_UPWARD); } static void to_nearest() { set_rounding_mode(FE_TONEAREST); } static void toward_zero() { set_rounding_mode(FE_TOWARDZERO); } };
} // namespace detail
extern "C" { float rintf(float); double rint(double); long double rintl(long double); }
template<> struct rounding_control<float>: detail::ia64_rounding_control { static float force_rounding(const float r) { volatile float _r = r; return _r; } static float to_int(const float& x) { return rintf(x); } };
template<> struct rounding_control<double>: detail::ia64_rounding_control { static const double & force_rounding(const double& r) { return r; } static double to_int(const double& r) { return rint(r); } };
template<> struct rounding_control<long double>: detail::ia64_rounding_control { static const long double & force_rounding(const long double& r) { return r; } static long double to_int(const long double& r) { return rintl(r); } };
} // namespace interval_lib } // namespace numeric } // namespace boost
#undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE
#endif /* __HP_aCC */
#endif /* BOOST_NUMERIC_INTERVAL_DETAIL_IA64_ROUNDING_CONTROL_HPP */
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost