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
|