glucat 0.13.0
scalar_imp.h
Go to the documentation of this file.
1#ifndef _GLUCAT_SCALAR_IMP_H
2#define _GLUCAT_SCALAR_IMP_H
3/***************************************************************************
4 GluCat : Generic library of universal Clifford algebra templates
5 scalar_imp.h : Define functions for scalar_t
6 -------------------
7 begin : 2001-12-20
8 copyright : (C) 2001-2014 by Paul C. Leopardi
9 ***************************************************************************
10
11 This library is free software: you can redistribute it and/or modify
12 it under the terms of the GNU Lesser General Public License as published
13 by the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
15
16 This library is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU Lesser General Public License for more details.
20
21 You should have received a copy of the GNU Lesser General Public License
22 along with this library. If not, see <http://www.gnu.org/licenses/>.
23
24 ***************************************************************************
25 This library is based on a prototype written by Arvind Raja and was
26 licensed under the LGPL with permission of the author. See Arvind Raja,
27 "Object-oriented implementations of Clifford algebras in C++: a prototype",
28 in Ablamowicz, Lounesto and Parra (eds.)
29 "Clifford algebras with numeric and symbolic computations, Birkhauser, 1996."
30 ***************************************************************************
31 See also Arvind Raja's original header comments and references in glucat.h
32 ***************************************************************************/
33
34#include "glucat/scalar.h"
35#include "glucat/qd.h"
36
37#include <boost/numeric/ublas/traits.hpp>
38
39#include <cmath>
40#include <limits>
41
42namespace glucat
43{
45 // Reference: [AA], 2.4, p. 30-31
46
48 template< >
49 template< typename Other_Scalar_T >
50 inline
51 auto
53 to_scalar_t(const Other_Scalar_T& val) -> float
54 { return static_cast<float>(numeric_traits<Other_Scalar_T>::to_double(val)); }
55
57 template< >
58 template< typename Other_Scalar_T >
59 inline
60 auto
62 to_scalar_t(const Other_Scalar_T& val) -> double
64
65#if defined(_GLUCAT_USE_QD)
67 template< >
68 template< >
69 inline
70 auto
72 to_scalar_t(const dd_real& val) -> long double
73 { return static_cast<long double>(val.x[0]) + static_cast<long double>(val.x[1]); }
74
76 template< >
77 template< >
78 inline
79 auto
81 to_scalar_t(const qd_real& val) -> long double
82 { return static_cast<long double>(val.x[0]) + static_cast<long double>(val.x[1]); }
83
85 template< >
86 template< >
87 inline
88 auto
90 to_scalar_t(const long double& val) -> dd_real
91 { return {double(val),double(val - static_cast<long double>(double(val)))}; }
92
94 template< >
95 template< >
96 inline
97 auto
99 to_scalar_t(const qd_real& val) -> dd_real
100 { return {val.x[0],val.x[1]}; }
101
103 template< >
104 template< >
105 inline
106 auto
108 to_scalar_t(const long double& val) -> qd_real
109 { return {double(val),double(val - static_cast<long double>(double(val))),0.0,0.0}; }
110
112 template< >
113 template< >
114 inline
115 auto
117 to_scalar_t(const dd_real& val) -> qd_real
118 { return {val.x[0],val.x[1],0.0,0.0}; }
119#endif
120
122 template< typename Scalar_T >
123 inline
124 auto
126 {
127 using promoted_scalar_t = typename numeric_traits<Scalar_T>::promoted::type;
129 }
130
132 template< typename Scalar_T >
133 inline
134 auto
135 to_demote(const Scalar_T& val) -> typename numeric_traits<Scalar_T>::demoted::type
136 {
137 using demoted_scalar_t = typename numeric_traits<Scalar_T>::demoted::type;
139 }
140}
141
142#endif // _GLUCAT_SCALAR_IMP_H
static auto to_scalar_t(const Other_Scalar_T &val) -> Scalar_T
Cast to Scalar_T.
Definition scalar.h:141
static auto to_double(const Scalar_T &val) -> double
Cast to double.
Definition scalar.h:133
auto to_demote(const Scalar_T &val) -> typename numeric_traits< Scalar_T >::demoted::type
Cast to demote.
Definition scalar_imp.h:135
auto to_promote(const Scalar_T &val) -> typename numeric_traits< Scalar_T >::promoted::type
Cast to promote.
Definition scalar_imp.h:125