annotate DEPENDENCIES/generic/include/boost/units/cmath.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.Units - A C++ library for zero-overhead dimensional analysis and
Chris@16 2 // unit/quantity manipulation and conversion
Chris@16 3 //
Chris@16 4 // Copyright (C) 2003-2008 Matthias Christian Schabel
Chris@16 5 // Copyright (C) 2007-2008 Steven Watanabe
Chris@16 6 //
Chris@16 7 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 8 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 9 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11 #ifndef BOOST_UNITS_CMATH_HPP
Chris@16 12 #define BOOST_UNITS_CMATH_HPP
Chris@16 13
Chris@16 14 #include <boost/config/no_tr1/cmath.hpp>
Chris@16 15 #include <cstdlib>
Chris@16 16
Chris@16 17 #include <boost/math/special_functions/fpclassify.hpp>
Chris@16 18 #include <boost/math/special_functions/hypot.hpp>
Chris@16 19 #include <boost/math/special_functions/next.hpp>
Chris@16 20 #include <boost/math/special_functions/round.hpp>
Chris@16 21 #include <boost/math/special_functions/sign.hpp>
Chris@16 22
Chris@16 23 #include <boost/units/dimensionless_quantity.hpp>
Chris@16 24 #include <boost/units/pow.hpp>
Chris@16 25 #include <boost/units/quantity.hpp>
Chris@16 26 #include <boost/units/detail/cmath_impl.hpp>
Chris@16 27 #include <boost/units/detail/dimensionless_unit.hpp>
Chris@16 28
Chris@16 29 #include <boost/units/systems/si/plane_angle.hpp>
Chris@16 30
Chris@16 31 /// \file
Chris@16 32 /// \brief Overloads of functions in \<cmath\> for quantities.
Chris@16 33 /// \details Only functions for which a dimensionally-correct result type
Chris@16 34 /// can be determined are overloaded.
Chris@16 35 /// All functions work with dimensionless quantities.
Chris@16 36
Chris@16 37 // BOOST_PREVENT_MACRO_SUBSTITUTION is needed on certain compilers that define
Chris@16 38 // some <cmath> functions as macros; it is used for all functions even though it
Chris@16 39 // isn't necessary -- I didn't want to think :)
Chris@16 40 //
Chris@16 41 // the form using namespace detail; return(f(x)); is used
Chris@16 42 // to enable ADL for UDTs.
Chris@16 43
Chris@16 44 namespace boost {
Chris@16 45
Chris@16 46 namespace units {
Chris@16 47
Chris@16 48 template<class Unit,class Y>
Chris@16 49 inline
Chris@16 50 bool
Chris@16 51 isfinite BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 52 {
Chris@16 53 using boost::math::isfinite;
Chris@16 54 return isfinite BOOST_PREVENT_MACRO_SUBSTITUTION (q.value());
Chris@16 55 }
Chris@16 56
Chris@16 57 template<class Unit,class Y>
Chris@16 58 inline
Chris@16 59 bool
Chris@16 60 isinf BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 61 {
Chris@16 62 using boost::math::isinf;
Chris@16 63 return isinf BOOST_PREVENT_MACRO_SUBSTITUTION (q.value());
Chris@16 64 }
Chris@16 65
Chris@16 66 template<class Unit,class Y>
Chris@16 67 inline
Chris@16 68 bool
Chris@16 69 isnan BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 70 {
Chris@16 71 using boost::math::isnan;
Chris@16 72 return isnan BOOST_PREVENT_MACRO_SUBSTITUTION (q.value());
Chris@16 73 }
Chris@16 74
Chris@16 75 template<class Unit,class Y>
Chris@16 76 inline
Chris@16 77 bool
Chris@16 78 isnormal BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 79 {
Chris@16 80 using boost::math::isnormal;
Chris@16 81 return isnormal BOOST_PREVENT_MACRO_SUBSTITUTION (q.value());
Chris@16 82 }
Chris@16 83
Chris@16 84 template<class Unit,class Y>
Chris@16 85 inline
Chris@16 86 bool
Chris@16 87 isgreater BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 88 const quantity<Unit,Y>& q2)
Chris@16 89 {
Chris@16 90 using namespace detail;
Chris@16 91 return isgreater BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value());
Chris@16 92 }
Chris@16 93
Chris@16 94 template<class Unit,class Y>
Chris@16 95 inline
Chris@16 96 bool
Chris@16 97 isgreaterequal BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 98 const quantity<Unit,Y>& q2)
Chris@16 99 {
Chris@16 100 using namespace detail;
Chris@16 101 return isgreaterequal BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value());
Chris@16 102 }
Chris@16 103
Chris@16 104 template<class Unit,class Y>
Chris@16 105 inline
Chris@16 106 bool
Chris@16 107 isless BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 108 const quantity<Unit,Y>& q2)
Chris@16 109 {
Chris@16 110 using namespace detail;
Chris@16 111 return isless BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value());
Chris@16 112 }
Chris@16 113
Chris@16 114 template<class Unit,class Y>
Chris@16 115 inline
Chris@16 116 bool
Chris@16 117 islessequal BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 118 const quantity<Unit,Y>& q2)
Chris@16 119 {
Chris@16 120 using namespace detail;
Chris@16 121 return islessequal BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value());
Chris@16 122 }
Chris@16 123
Chris@16 124 template<class Unit,class Y>
Chris@16 125 inline
Chris@16 126 bool
Chris@16 127 islessgreater BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 128 const quantity<Unit,Y>& q2)
Chris@16 129 {
Chris@16 130 using namespace detail;
Chris@16 131 return islessgreater BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value());
Chris@16 132 }
Chris@16 133
Chris@16 134 template<class Unit,class Y>
Chris@16 135 inline
Chris@16 136 bool
Chris@16 137 isunordered BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 138 const quantity<Unit,Y>& q2)
Chris@16 139 {
Chris@16 140 using namespace detail;
Chris@16 141 return isunordered BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value());
Chris@16 142 }
Chris@16 143
Chris@16 144 template<class Unit,class Y>
Chris@16 145 inline
Chris@16 146 quantity<Unit,Y>
Chris@16 147 abs BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 148 {
Chris@16 149 using std::abs;
Chris@16 150
Chris@16 151 typedef quantity<Unit,Y> quantity_type;
Chris@16 152
Chris@16 153 return quantity_type::from_value(abs BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 154 }
Chris@16 155
Chris@16 156 template<class Unit,class Y>
Chris@16 157 inline
Chris@16 158 quantity<Unit,Y>
Chris@16 159 ceil BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 160 {
Chris@16 161 using std::ceil;
Chris@16 162
Chris@16 163 typedef quantity<Unit,Y> quantity_type;
Chris@16 164
Chris@16 165 return quantity_type::from_value(ceil BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 166 }
Chris@16 167
Chris@16 168 template<class Unit,class Y>
Chris@16 169 inline
Chris@16 170 quantity<Unit,Y>
Chris@16 171 copysign BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 172 const quantity<Unit,Y>& q2)
Chris@16 173 {
Chris@16 174 using boost::math::copysign;
Chris@16 175
Chris@16 176 typedef quantity<Unit,Y> quantity_type;
Chris@16 177
Chris@16 178 return quantity_type::from_value(copysign BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value()));
Chris@16 179 }
Chris@16 180
Chris@16 181 template<class Unit,class Y>
Chris@16 182 inline
Chris@16 183 quantity<Unit,Y>
Chris@16 184 fabs BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 185 {
Chris@16 186 using std::fabs;
Chris@16 187
Chris@16 188 typedef quantity<Unit,Y> quantity_type;
Chris@16 189
Chris@16 190 return quantity_type::from_value(fabs BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 191 }
Chris@16 192
Chris@16 193 template<class Unit,class Y>
Chris@16 194 inline
Chris@16 195 quantity<Unit,Y>
Chris@16 196 floor BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 197 {
Chris@16 198 using std::floor;
Chris@16 199
Chris@16 200 typedef quantity<Unit,Y> quantity_type;
Chris@16 201
Chris@16 202 return quantity_type::from_value(floor BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 203 }
Chris@16 204
Chris@16 205 template<class Unit,class Y>
Chris@16 206 inline
Chris@16 207 quantity<Unit,Y>
Chris@16 208 fdim BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 209 const quantity<Unit,Y>& q2)
Chris@16 210 {
Chris@16 211 using namespace detail;
Chris@16 212
Chris@16 213 typedef quantity<Unit,Y> quantity_type;
Chris@16 214
Chris@16 215 return quantity_type::from_value(fdim BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value()));
Chris@16 216 }
Chris@16 217
Chris@16 218 #if 0
Chris@16 219
Chris@16 220 template<class Unit1,class Unit2,class Unit3,class Y>
Chris@16 221 inline
Chris@16 222 typename add_typeof_helper<
Chris@16 223 typename multiply_typeof_helper<quantity<Unit1,Y>,
Chris@16 224 quantity<Unit2,Y> >::type,
Chris@16 225 quantity<Unit3,Y> >::type
Chris@16 226 fma BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit1,Y>& q1,
Chris@16 227 const quantity<Unit2,Y>& q2,
Chris@16 228 const quantity<Unit3,Y>& q3)
Chris@16 229 {
Chris@16 230 using namespace detail;
Chris@16 231
Chris@16 232 typedef quantity<Unit1,Y> type1;
Chris@16 233 typedef quantity<Unit2,Y> type2;
Chris@16 234 typedef quantity<Unit3,Y> type3;
Chris@16 235
Chris@16 236 typedef typename multiply_typeof_helper<type1,type2>::type prod_type;
Chris@16 237 typedef typename add_typeof_helper<prod_type,type3>::type quantity_type;
Chris@16 238
Chris@16 239 return quantity_type::from_value(fma BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value(),q3.value()));
Chris@16 240 }
Chris@16 241
Chris@16 242 #endif
Chris@16 243
Chris@16 244 template<class Unit,class Y>
Chris@16 245 inline
Chris@16 246 quantity<Unit,Y>
Chris@16 247 fmax BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 248 const quantity<Unit,Y>& q2)
Chris@16 249 {
Chris@16 250 using namespace detail;
Chris@16 251
Chris@16 252 typedef quantity<Unit,Y> quantity_type;
Chris@16 253
Chris@16 254 return quantity_type::from_value(fmax BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value()));
Chris@16 255 }
Chris@16 256
Chris@16 257 template<class Unit,class Y>
Chris@16 258 inline
Chris@16 259 quantity<Unit,Y>
Chris@16 260 fmin BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 261 const quantity<Unit,Y>& q2)
Chris@16 262 {
Chris@16 263 using namespace detail;
Chris@16 264
Chris@16 265 typedef quantity<Unit,Y> quantity_type;
Chris@16 266
Chris@16 267 return quantity_type::from_value(fmin BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value()));
Chris@16 268 }
Chris@16 269
Chris@16 270 template<class Unit,class Y>
Chris@16 271 inline
Chris@16 272 int
Chris@16 273 fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 274 {
Chris@16 275 using boost::math::fpclassify;
Chris@16 276
Chris@16 277 return fpclassify BOOST_PREVENT_MACRO_SUBSTITUTION (q.value());
Chris@16 278 }
Chris@16 279
Chris@16 280 template<class Unit,class Y>
Chris@16 281 inline
Chris@16 282 typename root_typeof_helper<
Chris@16 283 typename add_typeof_helper<
Chris@16 284 typename power_typeof_helper<quantity<Unit,Y>,
Chris@16 285 static_rational<2> >::type,
Chris@16 286 typename power_typeof_helper<quantity<Unit,Y>,
Chris@16 287 static_rational<2> >::type>::type,
Chris@16 288 static_rational<2> >::type
Chris@16 289 hypot BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,const quantity<Unit,Y>& q2)
Chris@16 290 {
Chris@16 291 using boost::math::hypot;
Chris@16 292
Chris@16 293 typedef quantity<Unit,Y> type1;
Chris@16 294
Chris@16 295 typedef typename power_typeof_helper<type1,static_rational<2> >::type pow_type;
Chris@16 296 typedef typename add_typeof_helper<pow_type,pow_type>::type add_type;
Chris@16 297 typedef typename root_typeof_helper<add_type,static_rational<2> >::type quantity_type;
Chris@16 298
Chris@16 299 return quantity_type::from_value(hypot BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value()));
Chris@16 300 }
Chris@16 301
Chris@16 302 // does ISO C++ support long long? g++ claims not
Chris@16 303 //template<class Unit,class Y>
Chris@16 304 //inline
Chris@16 305 //quantity<Unit,long long>
Chris@16 306 //llrint BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 307 //{
Chris@16 308 // using namespace detail;
Chris@16 309 //
Chris@16 310 // typedef quantity<Unit,long long> quantity_type;
Chris@16 311 //
Chris@16 312 // return quantity_type::from_value(llrint BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 313 //}
Chris@16 314
Chris@16 315 // does ISO C++ support long long? g++ claims not
Chris@16 316 //template<class Unit,class Y>
Chris@16 317 //inline
Chris@16 318 //quantity<Unit,long long>
Chris@16 319 //llround BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 320 //{
Chris@16 321 // using namespace detail;
Chris@16 322 //
Chris@16 323 // typedef quantity<Unit,long long> quantity_type;
Chris@16 324 //
Chris@16 325 // return quantity_type::from_value(llround BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 326 //}
Chris@16 327
Chris@16 328 #if 0
Chris@16 329
Chris@16 330 template<class Unit,class Y>
Chris@16 331 inline
Chris@16 332 quantity<Unit,Y>
Chris@16 333 nearbyint BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 334 {
Chris@16 335 using namespace detail;
Chris@16 336
Chris@16 337 typedef quantity<Unit,Y> quantity_type;
Chris@16 338
Chris@16 339 return quantity_type::from_value(nearbyint BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 340 }
Chris@16 341
Chris@16 342 #endif
Chris@16 343
Chris@16 344 template<class Unit,class Y>
Chris@16 345 inline
Chris@16 346 quantity<Unit,Y> nextafter BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 347 const quantity<Unit,Y>& q2)
Chris@16 348 {
Chris@16 349 using boost::math::nextafter;
Chris@16 350
Chris@16 351 typedef quantity<Unit,Y> quantity_type;
Chris@16 352
Chris@16 353 return quantity_type::from_value(nextafter BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value()));
Chris@16 354 }
Chris@16 355 template<class Unit,class Y>
Chris@16 356 inline
Chris@16 357 quantity<Unit,Y> nexttoward BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q1,
Chris@16 358 const quantity<Unit,Y>& q2)
Chris@16 359 {
Chris@16 360 // the only difference between nextafter and nexttowards is
Chris@16 361 // in the argument types. Since we are requiring identical
Chris@16 362 // argument types, there is no difference.
Chris@16 363 using boost::math::nextafter;
Chris@16 364
Chris@16 365 typedef quantity<Unit,Y> quantity_type;
Chris@16 366
Chris@16 367 return quantity_type::from_value(nextafter BOOST_PREVENT_MACRO_SUBSTITUTION (q1.value(),q2.value()));
Chris@16 368 }
Chris@16 369
Chris@16 370 #if 0
Chris@16 371
Chris@16 372 template<class Unit,class Y>
Chris@16 373 inline
Chris@16 374 quantity<Unit,Y>
Chris@16 375 rint BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 376 {
Chris@16 377 using namespace detail;
Chris@16 378
Chris@16 379 typedef quantity<Unit,Y> quantity_type;
Chris@16 380
Chris@16 381 return quantity_type::from_value(rint BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 382 }
Chris@16 383
Chris@16 384 #endif
Chris@16 385
Chris@16 386 template<class Unit,class Y>
Chris@16 387 inline
Chris@16 388 quantity<Unit,Y>
Chris@16 389 round BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 390 {
Chris@16 391 using boost::math::round;
Chris@16 392
Chris@16 393 typedef quantity<Unit,Y> quantity_type;
Chris@16 394
Chris@16 395 return quantity_type::from_value(round BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 396 }
Chris@16 397
Chris@16 398 template<class Unit,class Y>
Chris@16 399 inline
Chris@16 400 int
Chris@16 401 signbit BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 402 {
Chris@16 403 using boost::math::signbit;
Chris@16 404
Chris@16 405 return signbit BOOST_PREVENT_MACRO_SUBSTITUTION (q.value());
Chris@16 406 }
Chris@16 407
Chris@16 408 template<class Unit,class Y>
Chris@16 409 inline
Chris@16 410 quantity<Unit,Y>
Chris@16 411 trunc BOOST_PREVENT_MACRO_SUBSTITUTION (const quantity<Unit,Y>& q)
Chris@16 412 {
Chris@16 413 using namespace detail;
Chris@16 414
Chris@16 415 typedef quantity<Unit,Y> quantity_type;
Chris@16 416
Chris@16 417 return quantity_type::from_value(trunc BOOST_PREVENT_MACRO_SUBSTITUTION (q.value()));
Chris@16 418 }
Chris@16 419
Chris@16 420 template<class Unit,class Y>
Chris@16 421 inline
Chris@16 422 quantity<Unit, Y>
Chris@16 423 fmod(const quantity<Unit,Y>& q1, const quantity<Unit,Y>& q2)
Chris@16 424 {
Chris@16 425 using std::fmod;
Chris@16 426
Chris@16 427 typedef quantity<Unit,Y> quantity_type;
Chris@16 428
Chris@16 429 return quantity_type::from_value(fmod(q1.value(), q2.value()));
Chris@16 430 }
Chris@16 431
Chris@16 432 template<class Unit, class Y>
Chris@16 433 inline
Chris@16 434 quantity<Unit, Y>
Chris@16 435 modf(const quantity<Unit, Y>& q1, quantity<Unit, Y>* q2)
Chris@16 436 {
Chris@16 437 using std::modf;
Chris@16 438
Chris@16 439 typedef quantity<Unit,Y> quantity_type;
Chris@16 440
Chris@16 441 return quantity_type::from_value(modf(q1.value(), &quantity_cast<Y&>(*q2)));
Chris@16 442 }
Chris@16 443
Chris@16 444 template<class Unit, class Y, class Int>
Chris@16 445 inline
Chris@16 446 quantity<Unit, Y>
Chris@16 447 frexp(const quantity<Unit, Y>& q,Int* ex)
Chris@16 448 {
Chris@16 449 using std::frexp;
Chris@16 450
Chris@16 451 typedef quantity<Unit,Y> quantity_type;
Chris@16 452
Chris@16 453 return quantity_type::from_value(frexp(q.value(),ex));
Chris@16 454 }
Chris@16 455
Chris@16 456 /// For non-dimensionless quantities, integral and rational powers
Chris@16 457 /// and roots can be computed by @c pow<Ex> and @c root<Rt> respectively.
Chris@16 458 template<class S, class Y>
Chris@16 459 inline
Chris@16 460 quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>
Chris@16 461 pow(const quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>& q1,
Chris@16 462 const quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>& q2)
Chris@16 463 {
Chris@16 464 using std::pow;
Chris@16 465
Chris@16 466 typedef quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S),Y> quantity_type;
Chris@16 467
Chris@16 468 return quantity_type::from_value(pow(q1.value(), q2.value()));
Chris@16 469 }
Chris@16 470
Chris@16 471 template<class S, class Y>
Chris@16 472 inline
Chris@16 473 quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>
Chris@16 474 exp(const quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>& q)
Chris@16 475 {
Chris@16 476 using std::exp;
Chris@16 477
Chris@16 478 typedef quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y> quantity_type;
Chris@16 479
Chris@16 480 return quantity_type::from_value(exp(q.value()));
Chris@16 481 }
Chris@16 482
Chris@16 483 template<class Unit, class Y, class Int>
Chris@16 484 inline
Chris@16 485 quantity<Unit, Y>
Chris@16 486 ldexp(const quantity<Unit, Y>& q,const Int& ex)
Chris@16 487 {
Chris@16 488 using std::ldexp;
Chris@16 489
Chris@16 490 typedef quantity<Unit,Y> quantity_type;
Chris@16 491
Chris@16 492 return quantity_type::from_value(ldexp(q.value(), ex));
Chris@16 493 }
Chris@16 494
Chris@16 495 template<class S, class Y>
Chris@16 496 inline
Chris@16 497 quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>
Chris@16 498 log(const quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>& q)
Chris@16 499 {
Chris@16 500 using std::log;
Chris@16 501
Chris@16 502 typedef quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y> quantity_type;
Chris@16 503
Chris@16 504 return quantity_type::from_value(log(q.value()));
Chris@16 505 }
Chris@16 506
Chris@16 507 template<class S, class Y>
Chris@16 508 inline
Chris@16 509 quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>
Chris@16 510 log10(const quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y>& q)
Chris@16 511 {
Chris@16 512 using std::log10;
Chris@16 513
Chris@16 514 typedef quantity<BOOST_UNITS_DIMENSIONLESS_UNIT(S), Y> quantity_type;
Chris@16 515
Chris@16 516 return quantity_type::from_value(log10(q.value()));
Chris@16 517 }
Chris@16 518
Chris@16 519 template<class Unit,class Y>
Chris@16 520 inline
Chris@16 521 typename root_typeof_helper<
Chris@16 522 quantity<Unit,Y>,
Chris@16 523 static_rational<2>
Chris@16 524 >::type
Chris@16 525 sqrt(const quantity<Unit,Y>& q)
Chris@16 526 {
Chris@16 527 using std::sqrt;
Chris@16 528
Chris@16 529 typedef typename root_typeof_helper<
Chris@16 530 quantity<Unit,Y>,
Chris@16 531 static_rational<2>
Chris@16 532 >::type quantity_type;
Chris@16 533
Chris@16 534 return quantity_type::from_value(sqrt(q.value()));
Chris@16 535 }
Chris@16 536
Chris@16 537 } // namespace units
Chris@16 538
Chris@16 539 } // namespace boost
Chris@16 540
Chris@16 541 namespace boost {
Chris@16 542
Chris@16 543 namespace units {
Chris@16 544
Chris@16 545 // trig functions with si argument/return types
Chris@16 546
Chris@16 547 /// cos of theta in radians
Chris@16 548 template<class Y>
Chris@16 549 typename dimensionless_quantity<si::system,Y>::type
Chris@16 550 cos(const quantity<si::plane_angle,Y>& theta)
Chris@16 551 {
Chris@16 552 using std::cos;
Chris@16 553 return cos(theta.value());
Chris@16 554 }
Chris@16 555
Chris@16 556 /// sin of theta in radians
Chris@16 557 template<class Y>
Chris@16 558 typename dimensionless_quantity<si::system,Y>::type
Chris@16 559 sin(const quantity<si::plane_angle,Y>& theta)
Chris@16 560 {
Chris@16 561 using std::sin;
Chris@16 562 return sin(theta.value());
Chris@16 563 }
Chris@16 564
Chris@16 565 /// tan of theta in radians
Chris@16 566 template<class Y>
Chris@16 567 typename dimensionless_quantity<si::system,Y>::type
Chris@16 568 tan(const quantity<si::plane_angle,Y>& theta)
Chris@16 569 {
Chris@16 570 using std::tan;
Chris@16 571 return tan(theta.value());
Chris@16 572 }
Chris@16 573
Chris@16 574 /// cos of theta in other angular units
Chris@16 575 template<class System,class Y>
Chris@16 576 typename dimensionless_quantity<System,Y>::type
Chris@16 577 cos(const quantity<unit<plane_angle_dimension,System>,Y>& theta)
Chris@16 578 {
Chris@16 579 return cos(quantity<si::plane_angle,Y>(theta));
Chris@16 580 }
Chris@16 581
Chris@16 582 /// sin of theta in other angular units
Chris@16 583 template<class System,class Y>
Chris@16 584 typename dimensionless_quantity<System,Y>::type
Chris@16 585 sin(const quantity<unit<plane_angle_dimension,System>,Y>& theta)
Chris@16 586 {
Chris@16 587 return sin(quantity<si::plane_angle,Y>(theta));
Chris@16 588 }
Chris@16 589
Chris@16 590 /// tan of theta in other angular units
Chris@16 591 template<class System,class Y>
Chris@16 592 typename dimensionless_quantity<System,Y>::type
Chris@16 593 tan(const quantity<unit<plane_angle_dimension,System>,Y>& theta)
Chris@16 594 {
Chris@16 595 return tan(quantity<si::plane_angle,Y>(theta));
Chris@16 596 }
Chris@16 597
Chris@16 598 /// acos of dimensionless quantity returning angle in same system
Chris@16 599 template<class Y,class System>
Chris@16 600 quantity<unit<plane_angle_dimension, homogeneous_system<System> >,Y>
Chris@16 601 acos(const quantity<unit<dimensionless_type, homogeneous_system<System> >,Y>& val)
Chris@16 602 {
Chris@16 603 using std::acos;
Chris@16 604 return quantity<unit<plane_angle_dimension, homogeneous_system<System> >,Y>(acos(val.value())*si::radians);
Chris@16 605 }
Chris@16 606
Chris@16 607 /// acos of dimensionless quantity returning angle in radians
Chris@16 608 template<class Y>
Chris@16 609 quantity<angle::radian_base_unit::unit_type,Y>
Chris@16 610 acos(const quantity<unit<dimensionless_type, heterogeneous_dimensionless_system>,Y>& val)
Chris@16 611 {
Chris@16 612 using std::acos;
Chris@16 613 return quantity<angle::radian_base_unit::unit_type,Y>::from_value(acos(val.value()));
Chris@16 614 }
Chris@16 615
Chris@16 616 /// asin of dimensionless quantity returning angle in same system
Chris@16 617 template<class Y,class System>
Chris@16 618 quantity<unit<plane_angle_dimension, homogeneous_system<System> >,Y>
Chris@16 619 asin(const quantity<unit<dimensionless_type, homogeneous_system<System> >,Y>& val)
Chris@16 620 {
Chris@16 621 using std::asin;
Chris@16 622 return quantity<unit<plane_angle_dimension, homogeneous_system<System> >,Y>(asin(val.value())*si::radians);
Chris@16 623 }
Chris@16 624
Chris@16 625 /// asin of dimensionless quantity returning angle in radians
Chris@16 626 template<class Y>
Chris@16 627 quantity<angle::radian_base_unit::unit_type,Y>
Chris@16 628 asin(const quantity<unit<dimensionless_type, heterogeneous_dimensionless_system>,Y>& val)
Chris@16 629 {
Chris@16 630 using std::asin;
Chris@16 631 return quantity<angle::radian_base_unit::unit_type,Y>::from_value(asin(val.value()));
Chris@16 632 }
Chris@16 633
Chris@16 634 /// atan of dimensionless quantity returning angle in same system
Chris@16 635 template<class Y,class System>
Chris@16 636 quantity<unit<plane_angle_dimension, homogeneous_system<System> >,Y>
Chris@16 637 atan(const quantity<unit<dimensionless_type, homogeneous_system<System> >, Y>& val)
Chris@16 638 {
Chris@16 639 using std::atan;
Chris@16 640 return quantity<unit<plane_angle_dimension, homogeneous_system<System> >,Y>(atan(val.value())*si::radians);
Chris@16 641 }
Chris@16 642
Chris@16 643 /// atan of dimensionless quantity returning angle in radians
Chris@16 644 template<class Y>
Chris@16 645 quantity<angle::radian_base_unit::unit_type,Y>
Chris@16 646 atan(const quantity<unit<dimensionless_type, heterogeneous_dimensionless_system>, Y>& val)
Chris@16 647 {
Chris@16 648 using std::atan;
Chris@16 649 return quantity<angle::radian_base_unit::unit_type,Y>::from_value(atan(val.value()));
Chris@16 650 }
Chris@16 651
Chris@16 652 /// atan2 of @c value_type returning angle in radians
Chris@16 653 template<class Y, class Dimension, class System>
Chris@16 654 quantity<unit<plane_angle_dimension, homogeneous_system<System> >, Y>
Chris@16 655 atan2(const quantity<unit<Dimension, homogeneous_system<System> >, Y>& y,
Chris@16 656 const quantity<unit<Dimension, homogeneous_system<System> >, Y>& x)
Chris@16 657 {
Chris@16 658 using std::atan2;
Chris@16 659 return quantity<unit<plane_angle_dimension, homogeneous_system<System> >, Y>(atan2(y.value(),x.value())*si::radians);
Chris@16 660 }
Chris@16 661
Chris@16 662 /// atan2 of @c value_type returning angle in radians
Chris@16 663 template<class Y, class Dimension, class System>
Chris@16 664 quantity<angle::radian_base_unit::unit_type,Y>
Chris@16 665 atan2(const quantity<unit<Dimension, heterogeneous_system<System> >, Y>& y,
Chris@16 666 const quantity<unit<Dimension, heterogeneous_system<System> >, Y>& x)
Chris@16 667 {
Chris@16 668 using std::atan2;
Chris@16 669 return quantity<angle::radian_base_unit::unit_type,Y>::from_value(atan2(y.value(),x.value()));
Chris@16 670 }
Chris@16 671
Chris@16 672 } // namespace units
Chris@16 673
Chris@16 674 } // namespace boost
Chris@16 675
Chris@16 676 #endif // BOOST_UNITS_CMATH_HPP