1 /* Boost interval/hw_rounding.hpp template implementation file 2 * 3 * Copyright 2002 Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion 4 * Copyright 2005 Guillaume Melquiond 5 * 6 * Distributed under the Boost Software License, Version 1.0. 7 * (See accompanying file LICENSE_1_0.txt or 8 * copy at http://www.boost.org/LICENSE_1_0.txt) 9 */ 10 11 #ifndef BOOST_NUMERIC_INTERVAL_HW_ROUNDING_HPP 12 #define BOOST_NUMERIC_INTERVAL_HW_ROUNDING_HPP 13 14 #include <boost/numeric/interval/rounding.hpp> 15 #include <boost/numeric/interval/rounded_arith.hpp> 16 17 #define BOOST_NUMERIC_INTERVAL_NO_HARDWARE 18 19 // define appropriate specialization of rounding_control for built-in types 20 #if defined(__x86_64__) && (defined(__USE_ISOC99) || defined(__APPLE__)) 21 # include <boost/numeric/interval/detail/c99_rounding_control.hpp> 22 #elif defined(__i386__) || defined(_M_IX86) || defined(__BORLANDC__) && !defined(__clang__) || defined(_M_X64) 23 # include <boost/numeric/interval/detail/x86_rounding_control.hpp> 24 #elif defined(__i386) && defined(__SUNPRO_CC) 25 # include <boost/numeric/interval/detail/x86_rounding_control.hpp> 26 #elif defined(powerpc) || defined(__powerpc__) || defined(__ppc__) 27 # include <boost/numeric/interval/detail/ppc_rounding_control.hpp> 28 #elif defined(sparc) || defined(__sparc__) 29 # include <boost/numeric/interval/detail/sparc_rounding_control.hpp> 30 #elif defined(alpha) || defined(__alpha__) 31 # include <boost/numeric/interval/detail/alpha_rounding_control.hpp> 32 #elif defined(ia64) || defined(__ia64) || defined(__ia64__) 33 # include <boost/numeric/interval/detail/ia64_rounding_control.hpp> 34 #endif 35 36 #if defined(BOOST_NUMERIC_INTERVAL_NO_HARDWARE) && (defined(__USE_ISOC99) || defined(__MSL__)) 37 # include <boost/numeric/interval/detail/c99_rounding_control.hpp> 38 #endif 39 40 #if defined(BOOST_NUMERIC_INTERVAL_NO_HARDWARE) 41 # undef BOOST_NUMERIC_INTERVAL_NO_HARDWARE 42 # error Boost.Numeric.Interval: Please specify rounding control mechanism. 43 #endif 44 45 namespace boost { 46 namespace numeric { 47 namespace interval_lib { 48 49 /* 50 * Three specializations of rounded_math<T> 51 */ 52 53 template<> 54 struct rounded_math<float> 55 : save_state<rounded_arith_opp<float> > 56 {}; 57 58 template<> 59 struct rounded_math<double> 60 : save_state<rounded_arith_opp<double> > 61 {}; 62 63 template<> 64 struct rounded_math<long double> 65 : save_state<rounded_arith_opp<long double> > 66 {}; 67 68 } // namespace interval_lib 69 } // namespace numeric 70 } // namespace boost 71 72 #endif // BOOST_NUMERIC_INTERVAL_HW_ROUNDING_HPP 73