Chris@16: /* Boost interval/arith3.hpp template implementation file Chris@16: * Chris@16: * This headers provides arithmetical functions Chris@16: * which compute an interval given some base Chris@16: * numbers. The resulting interval encloses the Chris@16: * real result of the arithmetic operation. Chris@16: * Chris@16: * Copyright 2003 Guillaume Melquiond Chris@16: * Chris@16: * Distributed under the Boost Software License, Version 1.0. Chris@16: * (See accompanying file LICENSE_1_0.txt or Chris@16: * copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: Chris@16: #ifndef BOOST_NUMERIC_INTERVAL_ARITH3_HPP Chris@16: #define BOOST_NUMERIC_INTERVAL_ARITH3_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace interval_lib { Chris@16: Chris@16: template inline Chris@16: I add(const typename I::base_type& x, const typename I::base_type& y) Chris@16: { Chris@16: typedef typename I::traits_type Policies; Chris@16: if (detail::test_input(x, y)) Chris@16: return I::empty(); Chris@16: typename Policies::rounding rnd; Chris@16: return I(rnd.add_down(x, y), rnd.add_up(x, y), true); Chris@16: } Chris@16: Chris@16: template inline Chris@16: I sub(const typename I::base_type& x, const typename I::base_type& y) Chris@16: { Chris@16: typedef typename I::traits_type Policies; Chris@16: if (detail::test_input(x, y)) Chris@16: return I::empty(); Chris@16: typename Policies::rounding rnd; Chris@16: return I(rnd.sub_down(x, y), rnd.sub_up(x, y), true); Chris@16: } Chris@16: Chris@16: template inline Chris@16: I mul(const typename I::base_type& x, const typename I::base_type& y) Chris@16: { Chris@16: typedef typename I::traits_type Policies; Chris@16: if (detail::test_input(x, y)) Chris@16: return I::empty(); Chris@16: typename Policies::rounding rnd; Chris@16: return I(rnd.mul_down(x, y), rnd.mul_up(x, y), true); Chris@16: } Chris@16: Chris@16: template inline Chris@16: I div(const typename I::base_type& x, const typename I::base_type& y) Chris@16: { Chris@16: typedef typename I::traits_type Policies; Chris@16: if (detail::test_input(x, y) || user::is_zero(y)) Chris@16: return I::empty(); Chris@16: typename Policies::rounding rnd; Chris@16: return I(rnd.div_down(x, y), rnd.div_up(x, y), true); Chris@16: } Chris@16: Chris@16: } // namespace interval_lib Chris@16: } // namespace numeric Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_NUMERIC_INTERVAL_ARITH3_HPP