annotate DEPENDENCIES/generic/include/boost/numeric/interval/transc.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 /* Boost interval/transc.hpp template implementation file
Chris@16 2 *
Chris@16 3 * Copyright 2000 Jens Maurer
Chris@16 4 * Copyright 2002 Hervé Brönnimann, Guillaume Melquiond, Sylvain Pion
Chris@16 5 *
Chris@16 6 * Distributed under the Boost Software License, Version 1.0.
Chris@16 7 * (See accompanying file LICENSE_1_0.txt or
Chris@16 8 * copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 */
Chris@16 10
Chris@16 11 #ifndef BOOST_NUMERIC_INTERVAL_TRANSC_HPP
Chris@16 12 #define BOOST_NUMERIC_INTERVAL_TRANSC_HPP
Chris@16 13
Chris@16 14 #include <boost/config.hpp>
Chris@16 15 #include <boost/numeric/interval/detail/interval_prototype.hpp>
Chris@16 16 #include <boost/numeric/interval/detail/bugs.hpp>
Chris@16 17 #include <boost/numeric/interval/detail/test_input.hpp>
Chris@16 18 #include <boost/numeric/interval/rounding.hpp>
Chris@16 19 #include <boost/numeric/interval/constants.hpp>
Chris@16 20 #include <boost/numeric/interval/arith.hpp>
Chris@16 21 #include <boost/numeric/interval/arith2.hpp>
Chris@16 22 #include <algorithm>
Chris@16 23
Chris@16 24 namespace boost {
Chris@16 25 namespace numeric {
Chris@16 26
Chris@16 27 template<class T, class Policies> inline
Chris@16 28 interval<T, Policies> exp(const interval<T, Policies>& x)
Chris@16 29 {
Chris@16 30 typedef interval<T, Policies> I;
Chris@16 31 if (interval_lib::detail::test_input(x))
Chris@16 32 return I::empty();
Chris@16 33 typename Policies::rounding rnd;
Chris@16 34 return I(rnd.exp_down(x.lower()), rnd.exp_up(x.upper()), true);
Chris@16 35 }
Chris@16 36
Chris@16 37 template<class T, class Policies> inline
Chris@16 38 interval<T, Policies> log(const interval<T, Policies>& x)
Chris@16 39 {
Chris@16 40 typedef interval<T, Policies> I;
Chris@16 41 if (interval_lib::detail::test_input(x) ||
Chris@16 42 !interval_lib::user::is_pos(x.upper()))
Chris@16 43 return I::empty();
Chris@16 44 typename Policies::rounding rnd;
Chris@16 45 typedef typename Policies::checking checking;
Chris@16 46 T l = !interval_lib::user::is_pos(x.lower())
Chris@16 47 ? checking::neg_inf() : rnd.log_down(x.lower());
Chris@16 48 return I(l, rnd.log_up(x.upper()), true);
Chris@16 49 }
Chris@16 50
Chris@16 51 template<class T, class Policies> inline
Chris@16 52 interval<T, Policies> cos(const interval<T, Policies>& x)
Chris@16 53 {
Chris@16 54 if (interval_lib::detail::test_input(x))
Chris@16 55 return interval<T, Policies>::empty();
Chris@16 56 typename Policies::rounding rnd;
Chris@16 57 typedef interval<T, Policies> I;
Chris@16 58 typedef typename interval_lib::unprotect<I>::type R;
Chris@16 59
Chris@16 60 // get lower bound within [0, pi]
Chris@16 61 const R pi2 = interval_lib::pi_twice<R>();
Chris@16 62 R tmp = fmod((const R&)x, pi2);
Chris@16 63 if (width(tmp) >= pi2.lower())
Chris@16 64 return I(static_cast<T>(-1), static_cast<T>(1), true); // we are covering a full period
Chris@16 65 if (tmp.lower() >= interval_lib::constants::pi_upper<T>())
Chris@16 66 return -cos(tmp - interval_lib::pi<R>());
Chris@16 67 T l = tmp.lower();
Chris@16 68 T u = tmp.upper();
Chris@16 69
Chris@16 70 BOOST_USING_STD_MIN();
Chris@16 71 // separate into monotone subintervals
Chris@16 72 if (u <= interval_lib::constants::pi_lower<T>())
Chris@16 73 return I(rnd.cos_down(u), rnd.cos_up(l), true);
Chris@16 74 else if (u <= pi2.lower())
Chris@16 75 return I(static_cast<T>(-1), rnd.cos_up(min BOOST_PREVENT_MACRO_SUBSTITUTION(rnd.sub_down(pi2.lower(), u), l)), true);
Chris@16 76 else
Chris@16 77 return I(static_cast<T>(-1), static_cast<T>(1), true);
Chris@16 78 }
Chris@16 79
Chris@16 80 template<class T, class Policies> inline
Chris@16 81 interval<T, Policies> sin(const interval<T, Policies>& x)
Chris@16 82 {
Chris@16 83 typedef interval<T, Policies> I;
Chris@16 84 if (interval_lib::detail::test_input(x))
Chris@16 85 return I::empty();
Chris@16 86 typename Policies::rounding rnd;
Chris@16 87 typedef typename interval_lib::unprotect<I>::type R;
Chris@16 88 I r = cos((const R&)x - interval_lib::pi_half<R>());
Chris@16 89 (void)&rnd;
Chris@16 90 return r;
Chris@16 91 }
Chris@16 92
Chris@16 93 template<class T, class Policies> inline
Chris@16 94 interval<T, Policies> tan(const interval<T, Policies>& x)
Chris@16 95 {
Chris@16 96 typedef interval<T, Policies> I;
Chris@16 97 if (interval_lib::detail::test_input(x))
Chris@16 98 return I::empty();
Chris@16 99 typename Policies::rounding rnd;
Chris@16 100 typedef typename interval_lib::unprotect<I>::type R;
Chris@16 101
Chris@16 102 // get lower bound within [-pi/2, pi/2]
Chris@16 103 const R pi = interval_lib::pi<R>();
Chris@16 104 R tmp = fmod((const R&)x, pi);
Chris@16 105 const T pi_half_d = interval_lib::constants::pi_half_lower<T>();
Chris@16 106 if (tmp.lower() >= pi_half_d)
Chris@16 107 tmp -= pi;
Chris@16 108 if (tmp.lower() <= -pi_half_d || tmp.upper() >= pi_half_d)
Chris@16 109 return I::whole();
Chris@16 110 return I(rnd.tan_down(tmp.lower()), rnd.tan_up(tmp.upper()), true);
Chris@16 111 }
Chris@16 112
Chris@16 113 template<class T, class Policies> inline
Chris@16 114 interval<T, Policies> asin(const interval<T, Policies>& x)
Chris@16 115 {
Chris@16 116 typedef interval<T, Policies> I;
Chris@16 117 if (interval_lib::detail::test_input(x)
Chris@16 118 || x.upper() < static_cast<T>(-1) || x.lower() > static_cast<T>(1))
Chris@16 119 return I::empty();
Chris@16 120 typename Policies::rounding rnd;
Chris@16 121 T l = (x.lower() <= static_cast<T>(-1))
Chris@16 122 ? -interval_lib::constants::pi_half_upper<T>()
Chris@16 123 : rnd.asin_down(x.lower());
Chris@16 124 T u = (x.upper() >= static_cast<T>(1) )
Chris@16 125 ? interval_lib::constants::pi_half_upper<T>()
Chris@16 126 : rnd.asin_up (x.upper());
Chris@16 127 return I(l, u, true);
Chris@16 128 }
Chris@16 129
Chris@16 130 template<class T, class Policies> inline
Chris@16 131 interval<T, Policies> acos(const interval<T, Policies>& x)
Chris@16 132 {
Chris@16 133 typedef interval<T, Policies> I;
Chris@16 134 if (interval_lib::detail::test_input(x)
Chris@16 135 || x.upper() < static_cast<T>(-1) || x.lower() > static_cast<T>(1))
Chris@16 136 return I::empty();
Chris@16 137 typename Policies::rounding rnd;
Chris@16 138 T l = (x.upper() >= static_cast<T>(1) )
Chris@16 139 ? static_cast<T>(0)
Chris@16 140 : rnd.acos_down(x.upper());
Chris@16 141 T u = (x.lower() <= static_cast<T>(-1))
Chris@16 142 ? interval_lib::constants::pi_upper<T>()
Chris@16 143 : rnd.acos_up (x.lower());
Chris@16 144 return I(l, u, true);
Chris@16 145 }
Chris@16 146
Chris@16 147 template<class T, class Policies> inline
Chris@16 148 interval<T, Policies> atan(const interval<T, Policies>& x)
Chris@16 149 {
Chris@16 150 typedef interval<T, Policies> I;
Chris@16 151 if (interval_lib::detail::test_input(x))
Chris@16 152 return I::empty();
Chris@16 153 typename Policies::rounding rnd;
Chris@16 154 return I(rnd.atan_down(x.lower()), rnd.atan_up(x.upper()), true);
Chris@16 155 }
Chris@16 156
Chris@16 157 template<class T, class Policies> inline
Chris@16 158 interval<T, Policies> sinh(const interval<T, Policies>& x)
Chris@16 159 {
Chris@16 160 typedef interval<T, Policies> I;
Chris@16 161 if (interval_lib::detail::test_input(x))
Chris@16 162 return I::empty();
Chris@16 163 typename Policies::rounding rnd;
Chris@16 164 return I(rnd.sinh_down(x.lower()), rnd.sinh_up(x.upper()), true);
Chris@16 165 }
Chris@16 166
Chris@16 167 template<class T, class Policies> inline
Chris@16 168 interval<T, Policies> cosh(const interval<T, Policies>& x)
Chris@16 169 {
Chris@16 170 typedef interval<T, Policies> I;
Chris@16 171 if (interval_lib::detail::test_input(x))
Chris@16 172 return I::empty();
Chris@16 173 typename Policies::rounding rnd;
Chris@16 174 if (interval_lib::user::is_neg(x.upper()))
Chris@16 175 return I(rnd.cosh_down(x.upper()), rnd.cosh_up(x.lower()), true);
Chris@16 176 else if (!interval_lib::user::is_neg(x.lower()))
Chris@16 177 return I(rnd.cosh_down(x.lower()), rnd.cosh_up(x.upper()), true);
Chris@16 178 else
Chris@16 179 return I(static_cast<T>(1), rnd.cosh_up(-x.lower() > x.upper() ? x.lower() : x.upper()), true);
Chris@16 180 }
Chris@16 181
Chris@16 182 template<class T, class Policies> inline
Chris@16 183 interval<T, Policies> tanh(const interval<T, Policies>& x)
Chris@16 184 {
Chris@16 185 typedef interval<T, Policies> I;
Chris@16 186 if (interval_lib::detail::test_input(x))
Chris@16 187 return I::empty();
Chris@16 188 typename Policies::rounding rnd;
Chris@16 189 return I(rnd.tanh_down(x.lower()), rnd.tanh_up(x.upper()), true);
Chris@16 190 }
Chris@16 191
Chris@16 192 template<class T, class Policies> inline
Chris@16 193 interval<T, Policies> asinh(const interval<T, Policies>& x)
Chris@16 194 {
Chris@16 195 typedef interval<T, Policies> I;
Chris@16 196 if (interval_lib::detail::test_input(x))
Chris@16 197 return I::empty();
Chris@16 198 typename Policies::rounding rnd;
Chris@16 199 return I(rnd.asinh_down(x.lower()), rnd.asinh_up(x.upper()), true);
Chris@16 200 }
Chris@16 201
Chris@16 202 template<class T, class Policies> inline
Chris@16 203 interval<T, Policies> acosh(const interval<T, Policies>& x)
Chris@16 204 {
Chris@16 205 typedef interval<T, Policies> I;
Chris@16 206 if (interval_lib::detail::test_input(x) || x.upper() < static_cast<T>(1))
Chris@16 207 return I::empty();
Chris@16 208 typename Policies::rounding rnd;
Chris@16 209 T l = x.lower() <= static_cast<T>(1) ? static_cast<T>(0) : rnd.acosh_down(x.lower());
Chris@16 210 return I(l, rnd.acosh_up(x.upper()), true);
Chris@16 211 }
Chris@16 212
Chris@16 213 template<class T, class Policies> inline
Chris@16 214 interval<T, Policies> atanh(const interval<T, Policies>& x)
Chris@16 215 {
Chris@16 216 typedef interval<T, Policies> I;
Chris@16 217 if (interval_lib::detail::test_input(x)
Chris@16 218 || x.upper() < static_cast<T>(-1) || x.lower() > static_cast<T>(1))
Chris@16 219 return I::empty();
Chris@16 220 typename Policies::rounding rnd;
Chris@16 221 typedef typename Policies::checking checking;
Chris@16 222 T l = (x.lower() <= static_cast<T>(-1))
Chris@16 223 ? checking::neg_inf() : rnd.atanh_down(x.lower());
Chris@16 224 T u = (x.upper() >= static_cast<T>(1) )
Chris@16 225 ? checking::pos_inf() : rnd.atanh_up (x.upper());
Chris@16 226 return I(l, u, true);
Chris@16 227 }
Chris@16 228
Chris@16 229 } // namespace numeric
Chris@16 230 } // namespace boost
Chris@16 231
Chris@16 232 #endif // BOOST_NUMERIC_INTERVAL_TRANSC_HPP