5 [def __R3 ['[*'''R<superscript>3</superscript>''']]]
6 [def __R4 ['[*'''R<superscript>4</superscript>''']]]
7 [def __quadrulple ('''α,β,γ,δ''')]
8 [def __quat_formula ['[^q = '''α + βi + γj + δk''']]]
9 [def __quat_complex_formula ['[^q = ('''α + βi) + (γ + δi)j''' ]]]
10 [def __not_equal ['[^xy '''≠''' yx]]]
12 [mathpart quaternions Quaternions]
14 [section:quat_overview Overview]
16 Quaternions are a relative of complex numbers.
18 Quaternions are in fact part of a small hierarchy of structures built
19 upon the real numbers, which comprise only the set of real numbers
20 (traditionally named __R), the set of complex numbers (traditionally named __C),
21 the set of quaternions (traditionally named __H) and the set of octonions
22 (traditionally named __O), which possess interesting mathematical properties
23 (chief among which is the fact that they are ['division algebras],
24 ['i.e.] where the following property is true: if ['[^y]] is an element of that
25 algebra and is [*not equal to zero], then ['[^yx = yx']], where ['[^x]] and ['[^x']]
26 denote elements of that algebra, implies that ['[^x = x']]).
27 Each member of the hierarchy is a super-set of the former.
29 One of the most important aspects of quaternions is that they provide an
30 efficient way to parameterize rotations in __R3 (the usual three-dimensional space)
33 In practical terms, a quaternion is simply a quadruple of real numbers __quadrulple,
34 which we can write in the form __quat_formula, where ['[^i]] is the same object as for complex numbers,
35 and ['[^j]] and ['[^k]] are distinct objects which play essentially the same kind of role as ['[^i]].
37 An addition and a multiplication is defined on the set of quaternions,
38 which generalize their real and complex counterparts. The main novelty
39 here is that [*the multiplication is not commutative] (i.e. there are
40 quaternions ['[^x]] and ['[^y]] such that __not_equal). A good mnemotechnical way of remembering
41 things is by using the formula ['[^i*i = j*j = k*k = -1]].
43 Quaternions (and their kin) are described in far more details in this
44 other [@../quaternion/TQE.pdf document]
45 (with [@../quaternion/TQE_EA.pdf errata and addenda]).
47 Some traditional constructs, such as the exponential, carry over without
48 too much change into the realms of quaternions, but other, such as taking
49 a square root, do not.
51 [endsect] [/section:quat_overview Overview]
53 [section:quat_header Header File]
55 The interface and implementation are both supplied by the header file
56 [@../../../../boost/math/quaternion.hpp quaternion.hpp].
60 [section:quat_synopsis Synopsis]
62 namespace boost{ namespace math{
64 template<typename T> class ``[link math_toolkit.quat quaternion]``;
65 template<> class ``[link math_toolkit.spec quaternion<float>]``;
66 template<> class ``[link math_quaternion_double quaternion<double>]``;
67 template<> class ``[link math_quaternion_long_double quaternion<long double>]``;
70 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_addition_operators operator +]`` (T const & lhs, quaternion<T> const & rhs);
71 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_addition_operators operator +]`` (quaternion<T> const & lhs, T const & rhs);
72 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_addition_operators operator +]`` (::std::complex<T> const & lhs, quaternion<T> const & rhs);
73 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_addition_operators operator +]`` (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
74 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_addition_operators operator +]`` (quaternion<T> const & lhs, quaternion<T> const & rhs);
76 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_subtraction_operators operator -]`` (T const & lhs, quaternion<T> const & rhs);
77 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_subtraction_operators operator -]`` (quaternion<T> const & lhs, T const & rhs);
78 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_subtraction_operators operator -]`` (::std::complex<T> const & lhs, quaternion<T> const & rhs);
79 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_subtraction_operators operator -]`` (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
80 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_subtraction_operators operator -]`` (quaternion<T> const & lhs, quaternion<T> const & rhs);
82 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_multiplication_operators operator *]`` (T const & lhs, quaternion<T> const & rhs);
83 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_multiplication_operators operator *]`` (quaternion<T> const & lhs, T const & rhs);
84 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_multiplication_operators operator *]`` (::std::complex<T> const & lhs, quaternion<T> const & rhs);
85 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_multiplication_operators operator *]`` (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
86 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_multiplication_operators operator *]`` (quaternion<T> const & lhs, quaternion<T> const & rhs);
88 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_division_operators operator /]`` (T const & lhs, quaternion<T> const & rhs);
89 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_division_operators operator /]`` (quaternion<T> const & lhs, T const & rhs);
90 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_division_operators operator /]`` (::std::complex<T> const & lhs, quaternion<T> const & rhs);
91 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_division_operators operator /]`` (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
92 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.binary_division_operators operator /]`` (quaternion<T> const & lhs, quaternion<T> const & rhs);
94 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.unary_plus operator +]`` (quaternion<T> const & q);
95 template<typename T> quaternion<T> ``[link math_toolkit.quat_non_mem.unary_minus operator -]`` (quaternion<T> const & q);
97 template<typename T> bool ``[link math_toolkit.quat_non_mem.equality_operators operator ==]`` (T const & lhs, quaternion<T> const & rhs);
98 template<typename T> bool ``[link math_toolkit.quat_non_mem.equality_operators operator ==]`` (quaternion<T> const & lhs, T const & rhs);
99 template<typename T> bool ``[link math_toolkit.quat_non_mem.equality_operators operator ==]`` (::std::complex<T> const & lhs, quaternion<T> const & rhs);
100 template<typename T> bool ``[link math_toolkit.quat_non_mem.equality_operators operator ==]`` (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
101 template<typename T> bool ``[link math_toolkit.quat_non_mem.equality_operators operator ==]`` (quaternion<T> const & lhs, quaternion<T> const & rhs);
103 template<typename T> bool ``[link math_toolkit.quat_non_mem.inequality_operators operator !=]`` (T const & lhs, quaternion<T> const & rhs);
104 template<typename T> bool ``[link math_toolkit.quat_non_mem.inequality_operators operator !=]`` (quaternion<T> const & lhs, T const & rhs);
105 template<typename T> bool ``[link math_toolkit.quat_non_mem.inequality_operators operator !=]`` (::std::complex<T> const & lhs, quaternion<T> const & rhs);
106 template<typename T> bool ``[link math_toolkit.quat_non_mem.inequality_operators operator !=]`` (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
107 template<typename T> bool ``[link math_toolkit.quat_non_mem.inequality_operators operator !=]`` (quaternion<T> const & lhs, quaternion<T> const & rhs);
109 template<typename T, typename charT, class traits>
110 ::std::basic_istream<charT,traits>& ``[link math_toolkit.quat_non_mem.stream_extractor operator >>]`` (::std::basic_istream<charT,traits> & is, quaternion<T> & q);
112 template<typename T, typename charT, class traits>
113 ::std::basic_ostream<charT,traits>& operator ``[link math_toolkit.quat_non_mem.stream_inserter operator <<]`` (::std::basic_ostream<charT,traits> & os, quaternion<T> const & q);
116 template<typename T> T ``[link math_toolkit.value_op.real_and_unreal real]``(quaternion<T> const & q);
117 template<typename T> quaternion<T> ``[link math_toolkit.value_op.real_and_unreal unreal]``(quaternion<T> const & q);
119 template<typename T> T ``[link math_toolkit.value_op.sup sup]``(quaternion<T> const & q);
120 template<typename T> T ``[link math_toolkit.value_op.l1 l1]``(quaternion<T> const & q);
121 template<typename T> T ``[link math_toolkit.value_op.abs abs]``(quaternion<T> const & q);
122 template<typename T> T ``[link math_toolkit.value_op.norm norm]``(quaternion<T>const & q);
123 template<typename T> quaternion<T> ``[link math_toolkit.value_op.conj conj]``(quaternion<T> const & q);
125 template<typename T> quaternion<T> ``[link math_quaternions.creation_spherical]``(T const & rho, T const & theta, T const & phi1, T const & phi2);
126 template<typename T> quaternion<T> ``[link math_quaternions.creation_semipolar semipolar]``(T const & rho, T const & alpha, T const & theta1, T const & theta2);
127 template<typename T> quaternion<T> ``[link math_quaternions.creation_multipolar multipolar]``(T const & rho1, T const & theta1, T const & rho2, T const & theta2);
128 template<typename T> quaternion<T> ``[link math_quaternions.creation_cylindrospherical cylindrospherical]``(T const & t, T const & radius, T const & longitude, T const & latitude);
129 template<typename T> quaternion<T> ``[link math_quaternions.creation_cylindrical cylindrical]``(T const & r, T const & angle, T const & h1, T const & h2);
132 template<typename T> quaternion<T> ``[link math_toolkit.trans.exp exp]``(quaternion<T> const & q);
133 template<typename T> quaternion<T> ``[link math_toolkit.trans.cos cos]``(quaternion<T> const & q);
134 template<typename T> quaternion<T> ``[link math_toolkit.trans.sin sin]``(quaternion<T> const & q);
135 template<typename T> quaternion<T> ``[link math_toolkit.trans.tan tan]``(quaternion<T> const & q);
136 template<typename T> quaternion<T> ``[link math_toolkit.trans.cosh cosh]``(quaternion<T> const & q);
137 template<typename T> quaternion<T> ``[link math_toolkit.trans.sinh sinh]``(quaternion<T> const & q);
138 template<typename T> quaternion<T> ``[link math_toolkit.trans.tanh tanh]``(quaternion<T> const & q);
139 template<typename T> quaternion<T> ``[link math_toolkit.trans.pow pow]``(quaternion<T> const & q, int n);
144 [endsect] [/section:quat_header Header File]
146 [section:quat Template Class quaternion]
148 namespace boost{ namespace math{
155 typedef T ``[link math_toolkit.mem_typedef value_type]``;
157 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(T const & requested_a = T(), T const & requested_b = T(), T const & requested_c = T(), T const & requested_d = T());
158 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(::std::complex<T> const & z0, ::std::complex<T> const & z1 = ::std::complex<T>());
160 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(quaternion<X> const & a_recopier);
162 T ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts real]``() const;
163 quaternion<T> ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts unreal]``() const;
164 T ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_1]``() const;
165 T ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_2]``() const;
166 T ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_3]``() const;
167 T ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_4]``() const;
168 ::std::complex<T> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_1]``() const;
169 ::std::complex<T> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_2]``() const;
171 quaternion<T>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<T> const & a_affecter);
173 quaternion<T>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<X> const & a_affecter);
174 quaternion<T>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(T const & a_affecter);
175 quaternion<T>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(::std::complex<T> const & a_affecter);
177 quaternion<T>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(T const & rhs);
178 quaternion<T>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(::std::complex<T> const & rhs);
180 quaternion<T>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(quaternion<X> const & rhs);
182 quaternion<T>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(T const & rhs);
183 quaternion<T>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(::std::complex<T> const & rhs);
185 quaternion<T>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(quaternion<X> const & rhs);
187 quaternion<T>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(T const & rhs);
188 quaternion<T>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(::std::complex<T> const & rhs);
190 quaternion<T>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(quaternion<X> const & rhs);
192 quaternion<T>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(T const & rhs);
193 quaternion<T>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(::std::complex<T> const & rhs);
195 quaternion<T>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(quaternion<X> const & rhs);
201 [endsect] [/section:quat Template Class quaternion]
203 [section:spec Quaternion Specializations]
205 namespace boost{ namespace math{
208 class quaternion<float>
211 typedef float ``[link math_toolkit.mem_typedef value_type]``;
213 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(float const & requested_a = 0.0f, float const & requested_b = 0.0f, float const & requested_c = 0.0f, float const & requested_d = 0.0f);
214 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(::std::complex<float> const & z0, ::std::complex<float> const & z1 = ::std::complex<float>());
215 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(quaternion<double> const & a_recopier);
216 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(quaternion<long double> const & a_recopier);
218 float ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts real]``() const;
219 quaternion<float> ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts unreal]``() const;
220 float ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_1]``() const;
221 float ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_2]``() const;
222 float ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_3]``() const;
223 float ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_4]``() const;
224 ::std::complex<float> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_1]``() const;
225 ::std::complex<float> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_2]``() const;
227 quaternion<float>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<float> const & a_affecter);
229 quaternion<float>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<X> const & a_affecter);
230 quaternion<float>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(float const & a_affecter);
231 quaternion<float>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(::std::complex<float> const & a_affecter);
233 quaternion<float>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(float const & rhs);
234 quaternion<float>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(::std::complex<float> const & rhs);
236 quaternion<float>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(quaternion<X> const & rhs);
238 quaternion<float>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(float const & rhs);
239 quaternion<float>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(::std::complex<float> const & rhs);
241 quaternion<float>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(quaternion<X> const & rhs);
243 quaternion<float>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(float const & rhs);
244 quaternion<float>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(::std::complex<float> const & rhs);
246 quaternion<float>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(quaternion<X> const & rhs);
248 quaternion<float>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(float const & rhs);
249 quaternion<float>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(::std::complex<float> const & rhs);
251 quaternion<float>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(quaternion<X> const & rhs);
254 [#math_quaternion_double]
257 class quaternion<double>
260 typedef double ``[link math_toolkit.mem_typedef value_type]``;
262 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(double const & requested_a = 0.0, double const & requested_b = 0.0, double const & requested_c = 0.0, double const & requested_d = 0.0);
263 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(::std::complex<double> const & z0, ::std::complex<double> const & z1 = ::std::complex<double>());
264 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(quaternion<float> const & a_recopier);
265 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(quaternion<long double> const & a_recopier);
267 double ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts real]``() const;
268 quaternion<double> ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts unreal]``() const;
269 double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_1]``() const;
270 double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_2]``() const;
271 double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_3]``() const;
272 double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_4]``() const;
273 ::std::complex<double> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_1]``() const;
274 ::std::complex<double> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_2]``() const;
276 quaternion<double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<double> const & a_affecter);
278 quaternion<double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<X> const & a_affecter);
279 quaternion<double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(double const & a_affecter);
280 quaternion<double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(::std::complex<double> const & a_affecter);
282 quaternion<double>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(double const & rhs);
283 quaternion<double>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(::std::complex<double> const & rhs);
285 quaternion<double>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(quaternion<X> const & rhs);
287 quaternion<double>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(double const & rhs);
288 quaternion<double>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(::std::complex<double> const & rhs);
290 quaternion<double>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(quaternion<X> const & rhs);
292 quaternion<double>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(double const & rhs);
293 quaternion<double>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(::std::complex<double> const & rhs);
295 quaternion<double>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(quaternion<X> const & rhs);
297 quaternion<double>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(double const & rhs);
298 quaternion<double>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(::std::complex<double> const & rhs);
300 quaternion<double>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(quaternion<X> const & rhs);
303 [#math_quaternion_long_double]
306 class quaternion<long double>
309 typedef long double ``[link math_toolkit.mem_typedef value_type]``;
311 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(long double const & requested_a = 0.0L, long double const & requested_b = 0.0L, long double const & requested_c = 0.0L, long double const & requested_d = 0.0L);
312 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(::std::complex<long double> const & z0, ::std::complex<long double> const & z1 = ::std::complex<long double>());
313 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(quaternion<float> const & a_recopier);
314 explicit ``[link math_toolkit.quat_mem_fun.constructors quaternion]``(quaternion<double> const & a_recopier);
316 long double ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts real]``() const;
317 quaternion<long double> ``[link math_toolkit.quat_mem_fun.real_and_unreal_parts unreal]``() const;
318 long double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_1]``() const;
319 long double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_2]``() const;
320 long double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_3]``() const;
321 long double ``[link math_toolkit.quat_mem_fun.individual_real_components R_component_4]``() const;
322 ::std::complex<long double> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_1]``() const;
323 ::std::complex<long double> ``[link math_toolkit.quat_mem_fun.individual_complex_components C_component_2]``() const;
325 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<long double> const & a_affecter);
327 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(quaternion<X> const & a_affecter);
328 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(long double const & a_affecter);
329 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.assignment_operators operator = ]``(::std::complex<long double> const & a_affecter);
331 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(long double const & rhs);
332 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(::std::complex<long double> const & rhs);
334 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.addition_operators operator += ]``(quaternion<X> const & rhs);
336 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(long double const & rhs);
337 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(::std::complex<long double> const & rhs);
339 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.subtraction_operators operator -= ]``(quaternion<X> const & rhs);
341 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(long double const & rhs);
342 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(::std::complex<long double> const & rhs);
344 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.multiplication_operators operator *= ]``(quaternion<X> const & rhs);
346 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(long double const & rhs);
347 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(::std::complex<long double> const & rhs);
349 quaternion<long double>& ``[link math_toolkit.quat_mem_fun.division_operators operator /= ]``(quaternion<X> const & rhs);
355 [endsect] [/section:spec Quaternion Specializations]
357 [section:mem_typedef Quaternion Member Typedefs]
363 typedef T value_type;
365 Float specialization version:
367 typedef float value_type;
369 Double specialization version:
371 typedef double value_type;
373 Long double specialization version:
375 typedef long double value_type;
377 These provide easy acces to the type the template is built upon.
381 [section:quat_mem_fun Quaternion Member Functions]
386 explicit quaternion(T const & requested_a = T(), T const & requested_b = T(), T const & requested_c = T(), T const & requested_d = T());
387 explicit quaternion(::std::complex<T> const & z0, ::std::complex<T> const & z1 = ::std::complex<T>());
389 explicit quaternion(quaternion<X> const & a_recopier);
391 Float specialization version:
393 explicit quaternion(float const & requested_a = 0.0f, float const & requested_b = 0.0f, float const & requested_c = 0.0f, float const & requested_d = 0.0f);
394 explicit quaternion(::std::complex<float> const & z0,::std::complex<float> const & z1 = ::std::complex<float>());
395 explicit quaternion(quaternion<double> const & a_recopier);
396 explicit quaternion(quaternion<long double> const & a_recopier);
398 Double specialization version:
400 explicit quaternion(double const & requested_a = 0.0, double const & requested_b = 0.0, double const & requested_c = 0.0, double const & requested_d = 0.0);
401 explicit quaternion(::std::complex<double> const & z0, ::std::complex<double> const & z1 = ::std::complex<double>());
402 explicit quaternion(quaternion<float> const & a_recopier);
403 explicit quaternion(quaternion<long double> const & a_recopier);
405 Long double specialization version:
407 explicit quaternion(long double const & requested_a = 0.0L, long double const & requested_b = 0.0L, long double const & requested_c = 0.0L, long double const & requested_d = 0.0L);
408 explicit quaternion( ::std::complex<long double> const & z0, ::std::complex<long double> const & z1 = ::std::complex<long double>());
409 explicit quaternion(quaternion<float> const & a_recopier);
410 explicit quaternion(quaternion<double> const & a_recopier);
412 A default constructor is provided for each form, which initializes
413 each component to the default values for their type
414 (i.e. zero for floating numbers). This constructor can also accept
415 one to four base type arguments. A constructor is also provided to
416 build quaternions from one or two complex numbers sharing the same
417 base type. The unspecialized template also sports a templarized copy
418 constructor, while the specialized forms have copy constructors
419 from the other two specializations, which are explicit when a risk of
420 precision loss exists. For the unspecialized form, the base type's
421 constructors must not throw.
423 Destructors and untemplated copy constructors (from the same type) are
424 provided by the compiler. Converting copy constructors make use of a
425 templated helper function in a "detail" subnamespace.
427 [h3 Other member functions]
428 [h4 Real and Unreal Parts]
431 quaternion<T> unreal() const;
433 Like complex number, quaternions do have a meaningful notion of "real part",
434 but unlike them there is no meaningful notion of "imaginary part".
435 Instead there is an "unreal part" which itself is a quaternion,
436 and usually nothing simpler (as opposed to the complex number case).
437 These are returned by the first two functions.
439 [h4 Individual Real Components]
441 T R_component_1() const;
442 T R_component_2() const;
443 T R_component_3() const;
444 T R_component_4() const;
446 A quaternion having four real components, these are returned by these four
447 functions. Hence real and R_component_1 return the same value.
449 [h4 Individual Complex Components]
451 ::std::complex<T> C_component_1() const;
452 ::std::complex<T> C_component_2() const;
454 A quaternion likewise has two complex components, and as we have seen above,
455 for any quaternion __quat_formula we also have __quat_complex_formula. These functions return them.
456 The real part of `q.C_component_1()` is the same as `q.real()`.
458 [h3 Quaternion Member Operators]
459 [h4 Assignment Operators]
461 quaternion<T>& operator = (quaternion<T> const & a_affecter);
463 quaternion<T>& operator = (quaternion<X> const& a_affecter);
464 quaternion<T>& operator = (T const& a_affecter);
465 quaternion<T>& operator = (::std::complex<T> const& a_affecter);
467 These perform the expected assignment, with type modification if necessary
468 (for instance, assigning from a base type will set the real part to that
469 value, and all other components to zero). For the unspecialized form,
470 the base type's assignment operators must not throw.
472 [h4 Addition Operators]
474 quaternion<T>& operator += (T const & rhs)
475 quaternion<T>& operator += (::std::complex<T> const & rhs);
477 quaternion<T>& operator += (quaternion<X> const & rhs);
479 These perform the mathematical operation `(*this)+rhs` and store the result in
480 `*this`. The unspecialized form has exception guards, which the specialized
481 forms do not, so as to insure exception safety. For the unspecialized form,
482 the base type's assignment operators must not throw.
484 [h4 Subtraction Operators]
486 quaternion<T>& operator -= (T const & rhs)
487 quaternion<T>& operator -= (::std::complex<T> const & rhs);
489 quaternion<T>& operator -= (quaternion<X> const & rhs);
491 These perform the mathematical operation `(*this)-rhs` and store the result
492 in `*this`. The unspecialized form has exception guards, which the
493 specialized forms do not, so as to insure exception safety.
494 For the unspecialized form, the base type's assignment operators
497 [h4 Multiplication Operators]
499 quaternion<T>& operator *= (T const & rhs)
500 quaternion<T>& operator *= (::std::complex<T> const & rhs);
502 quaternion<T>& operator *= (quaternion<X> const & rhs);
504 These perform the mathematical operation `(*this)*rhs` [*in this order]
505 (order is important as multiplication is not commutative for quaternions)
506 and store the result in `*this`. The unspecialized form has exception guards,
507 which the specialized forms do not, so as to insure exception safety.
508 For the unspecialized form, the base type's assignment operators must not throw.
510 [h4 Division Operators]
512 quaternion<T>& operator /= (T const & rhs)
513 quaternion<T>& operator /= (::std::complex<T> const & rhs);
515 quaternion<T>& operator /= (quaternion<X> const & rhs);
517 These perform the mathematical operation `(*this)*inverse_of(rhs)` [*in this
518 order] (order is important as multiplication is not commutative for quaternions)
519 and store the result in `*this`. The unspecialized form has exception guards,
520 which the specialized forms do not, so as to insure exception safety.
521 For the unspecialized form, the base type's assignment operators must not throw.
523 [endsect] [/section:mem_typedef Quaternion Member Typedefs]
525 [section:quat_non_mem Quaternion Non-Member Operators]
530 quaternion<T> operator + (quaternion<T> const & q);
532 This unary operator simply returns q.
537 quaternion<T> operator - (quaternion<T> const & q);
539 This unary operator returns the opposite of q.
541 [h4 Binary Addition Operators]
543 template<typename T> quaternion<T> operator + (T const & lhs, quaternion<T> const & rhs);
544 template<typename T> quaternion<T> operator + (quaternion<T> const & lhs, T const & rhs);
545 template<typename T> quaternion<T> operator + (::std::complex<T> const & lhs, quaternion<T> const & rhs);
546 template<typename T> quaternion<T> operator + (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
547 template<typename T> quaternion<T> operator + (quaternion<T> const & lhs, quaternion<T> const & rhs);
549 These operators return `quaternion<T>(lhs) += rhs`.
551 [h4 Binary Subtraction Operators]
553 template<typename T> quaternion<T> operator - (T const & lhs, quaternion<T> const & rhs);
554 template<typename T> quaternion<T> operator - (quaternion<T> const & lhs, T const & rhs);
555 template<typename T> quaternion<T> operator - (::std::complex<T> const & lhs, quaternion<T> const & rhs);
556 template<typename T> quaternion<T> operator - (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
557 template<typename T> quaternion<T> operator - (quaternion<T> const & lhs, quaternion<T> const & rhs);
559 These operators return `quaternion<T>(lhs) -= rhs`.
561 [h4 Binary Multiplication Operators]
563 template<typename T> quaternion<T> operator * (T const & lhs, quaternion<T> const & rhs);
564 template<typename T> quaternion<T> operator * (quaternion<T> const & lhs, T const & rhs);
565 template<typename T> quaternion<T> operator * (::std::complex<T> const & lhs, quaternion<T> const & rhs);
566 template<typename T> quaternion<T> operator * (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
567 template<typename T> quaternion<T> operator * (quaternion<T> const & lhs, quaternion<T> const & rhs);
569 These operators return `quaternion<T>(lhs) *= rhs`.
571 [h4 Binary Division Operators]
573 template<typename T> quaternion<T> operator / (T const & lhs, quaternion<T> const & rhs);
574 template<typename T> quaternion<T> operator / (quaternion<T> const & lhs, T const & rhs);
575 template<typename T> quaternion<T> operator / (::std::complex<T> const & lhs, quaternion<T> const & rhs);
576 template<typename T> quaternion<T> operator / (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
577 template<typename T> quaternion<T> operator / (quaternion<T> const & lhs, quaternion<T> const & rhs);
579 These operators return `quaternion<T>(lhs) /= rhs`. It is of course still an
580 error to divide by zero...
582 [h4 Equality Operators]
584 template<typename T> bool operator == (T const & lhs, quaternion<T> const & rhs);
585 template<typename T> bool operator == (quaternion<T> const & lhs, T const & rhs);
586 template<typename T> bool operator == (::std::complex<T> const & lhs, quaternion<T> const & rhs);
587 template<typename T> bool operator == (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
588 template<typename T> bool operator == (quaternion<T> const & lhs, quaternion<T> const & rhs);
590 These return true if and only if the four components of `quaternion<T>(lhs)`
591 are equal to their counterparts in `quaternion<T>(rhs)`. As with any
592 floating-type entity, this is essentially meaningless.
594 [h4 Inequality Operators]
596 template<typename T> bool operator != (T const & lhs, quaternion<T> const & rhs);
597 template<typename T> bool operator != (quaternion<T> const & lhs, T const & rhs);
598 template<typename T> bool operator != (::std::complex<T> const & lhs, quaternion<T> const & rhs);
599 template<typename T> bool operator != (quaternion<T> const & lhs, ::std::complex<T> const & rhs);
600 template<typename T> bool operator != (quaternion<T> const & lhs, quaternion<T> const & rhs);
602 These return true if and only if `quaternion<T>(lhs) == quaternion<T>(rhs)` is
603 false. As with any floating-type entity, this is essentially meaningless.
605 [h4 Stream Extractor]
607 template<typename T, typename charT, class traits>
608 ::std::basic_istream<charT,traits>& operator >> (::std::basic_istream<charT,traits> & is, quaternion<T> & q);
610 Extracts a quaternion q of one of the following forms
611 (with a, b, c and d of type `T`):
613 [^a (a), (a,b), (a,b,c), (a,b,c,d) (a,(c)), (a,(c,d)), ((a)), ((a),c), ((a),(c)), ((a),(c,d)), ((a,b)), ((a,b),c), ((a,b),(c)), ((a,b),(c,d))]
615 The input values must be convertible to `T`. If bad input is encountered,
616 calls `is.setstate(ios::failbit)` (which may throw ios::failure (27.4.5.3)).
620 The rationale for the list of accepted formats is that either we have a
621 list of up to four reals, or else we have a couple of complex numbers,
622 and in that case if it formated as a proper complex number, then it should
623 be accepted. Thus potential ambiguities are lifted (for instance (a,b) is
624 (a,b,0,0) and not (a,0,b,0), i.e. it is parsed as a list of two real numbers
625 and not two complex numbers which happen to have imaginary parts equal to zero).
629 template<typename T, typename charT, class traits>
630 ::std::basic_ostream<charT,traits>& operator << (::std::basic_ostream<charT,traits> & os, quaternion<T> const & q);
632 Inserts the quaternion q onto the stream `os` as if it were implemented as follows:
634 template<typename T, typename charT, class traits>
635 ::std::basic_ostream<charT,traits>& operator << (
636 ::std::basic_ostream<charT,traits> & os,
637 quaternion<T> const & q)
639 ::std::basic_ostringstream<charT,traits> s;
642 s.imbue(os.getloc());
643 s.precision(os.precision());
645 s << '(' << q.R_component_1() << ','
646 << q.R_component_2() << ','
647 << q.R_component_3() << ','
648 << q.R_component_4() << ')';
650 return os << s.str();
653 [endsect] [/section:quat_non_mem Quaternion Non-Member Operators]
655 [section:value_op Quaternion Value Operations]
659 template<typename T> T real(quaternion<T> const & q);
660 template<typename T> quaternion<T> unreal(quaternion<T> const & q);
662 These return `q.real()` and `q.unreal()` respectively.
666 template<typename T> quaternion<T> conj(quaternion<T> const & q);
668 This returns the conjugate of the quaternion.
672 template<typename T> T sup(quaternion<T> const & q);
674 This return the sup norm (the greatest among
675 `abs(q.R_component_1())...abs(q.R_component_4()))` of the quaternion.
679 template<typename T> T l1(quaternion<T> const & q);
681 This return the l1 norm `(abs(q.R_component_1())+...+abs(q.R_component_4()))`
686 template<typename T> T abs(quaternion<T> const & q);
688 This return the magnitude (Euclidian norm) of the quaternion.
692 template<typename T> T norm(quaternion<T>const & q);
694 This return the (Cayley) norm of the quaternion.
695 The term "norm" might be confusing, as most people associate it with the
696 Euclidian norm (and quadratic functionals). For this version of
697 (the mathematical objects known as) quaternions, the Euclidian norm
698 (also known as magnitude) is the square root of the Cayley norm.
700 [endsect] [/section:value_op Quaternion Value Operations]
702 [section:create Quaternion Creation Functions]
704 template<typename T> quaternion<T> spherical(T const & rho, T const & theta, T const & phi1, T const & phi2);
705 template<typename T> quaternion<T> semipolar(T const & rho, T const & alpha, T const & theta1, T const & theta2);
706 template<typename T> quaternion<T> multipolar(T const & rho1, T const & theta1, T const & rho2, T const & theta2);
707 template<typename T> quaternion<T> cylindrospherical(T const & t, T const & radius, T const & longitude, T const & latitude);
708 template<typename T> quaternion<T> cylindrical(T const & r, T const & angle, T const & h1, T const & h2);
710 These build quaternions in a way similar to the way polar builds complex
711 numbers, as there is no strict equivalent to polar coordinates for quaternions.
713 [#math_quaternions.creation_spherical] `spherical` is a simple transposition of `polar`, it takes as inputs
714 a (positive) magnitude and a point on the hypersphere, given by three angles.
715 The first of these, `theta` has a natural range of `-pi` to `+pi`, and the other
716 two have natural ranges of `-pi/2` to `+pi/2` (as is the case with the usual
717 spherical coordinates in __R3). Due to the many symmetries and periodicities,
718 nothing untoward happens if the magnitude is negative or the angles are
719 outside their natural ranges. The expected degeneracies (a magnitude of
720 zero ignores the angles settings...) do happen however.
722 [#math_quaternions.creation_cylindrical] `cylindrical` is likewise a simple transposition of the usual
723 cylindrical coordinates in __R3, which in turn is another derivative of
724 planar polar coordinates. The first two inputs are the polar coordinates of
725 the first __C component of the quaternion. The third and fourth inputs
726 are placed into the third and fourth __R components of the quaternion,
729 [#math_quaternions.creation_multipolar] `multipolar` is yet another simple generalization of polar coordinates.
730 This time, both __C components of the quaternion are given in polar coordinates.
732 [#math_quaternions.creation_cylindrospherical] `cylindrospherical` is specific to quaternions. It is often interesting to
733 consider __H as the cartesian product of __R by __R3 (the quaternionic
734 multiplication as then a special form, as given here). This function
735 therefore builds a quaternion from this representation, with the __R3
736 component given in usual __R3 spherical coordinates.
738 [#math_quaternions.creation_semipolar] `semipolar` is another generator which is specific to quaternions.
739 It takes as a first input the magnitude of the quaternion, as a
740 second input an angle in the range `0` to `+pi/2` such that magnitudes
741 of the first two __C components of the quaternion are the product of the
742 first input and the sine and cosine of this angle, respectively, and finally
743 as third and fourth inputs angles in the range `-pi/2` to `+pi/2` which
744 represent the arguments of the first and second __C components of
745 the quaternion, respectively. As usual, nothing untoward happens if
746 what should be magnitudes are negative numbers or angles are out of their
747 natural ranges, as symmetries and periodicities kick in.
749 In this version of our implementation of quaternions, there is no
750 analogue of the complex value operation `arg` as the situation is
751 somewhat more complicated. Unit quaternions are linked both to
752 rotations in __R3 and in __R4, and the correspondences are not too complicated,
753 but there is currently a lack of standard (de facto or de jure) matrix
754 library with which the conversions could work. This should be remedied in
755 a further revision. In the mean time, an example of how this could be
756 done is presented here for
757 [@../../example/HSO3.hpp __R3], and here for
758 [@../../example/HSO4.hpp __R4]
759 ([@../../example/HSO3SO4.cpp example test file]).
761 [endsect] [/section:create Quaternion Creation Functions]
763 [section:trans Quaternion Transcendentals]
765 There is no `log` or `sqrt` provided for quaternions in this implementation,
766 and `pow` is likewise restricted to integral powers of the exponent.
767 There are several reasons to this: on the one hand, the equivalent of
768 analytic continuation for quaternions ("branch cuts") remains to be
769 investigated thoroughly (by me, at any rate...), and we wish to avoid the
770 nonsense introduced in the standard by exponentiations of complexes by
771 complexes (which is well defined, but not in the standard...).
772 Talking of nonsense, saying that `pow(0,0)` is "implementation defined" is just
775 We do, however provide several transcendentals, chief among which is the
776 exponential. This author claims the complete proof of the "closed formula"
777 as his own, as well as its independant invention (there are claims to prior
778 invention of the formula, such as one by Professor Shoemake, and it is
779 possible that the formula had been known a couple of centuries back, but in
780 absence of bibliographical reference, the matter is pending, awaiting further
781 investigation; on the other hand, the definition and existence of the
782 exponential on the quaternions, is of course a fact known for a very long time).
783 Basically, any converging power series with real coefficients which allows for a
784 closed formula in __C can be transposed to __H. More transcendentals of this
785 type could be added in a further revision upon request. It should be
786 noted that it is these functions which force the dependency upon the
787 [@../../../../boost/math/special_functions/sinc.hpp boost/math/special_functions/sinc.hpp] and the
788 [@../../../../boost/math/special_functions/sinhc.hpp boost/math/special_functions/sinhc.hpp] headers.
792 template<typename T> quaternion<T> exp(quaternion<T> const & q);
794 Computes the exponential of the quaternion.
798 template<typename T> quaternion<T> cos(quaternion<T> const & q);
800 Computes the cosine of the quaternion
804 template<typename T> quaternion<T> sin(quaternion<T> const & q);
806 Computes the sine of the quaternion.
810 template<typename T> quaternion<T> tan(quaternion<T> const & q);
812 Computes the tangent of the quaternion.
816 template<typename T> quaternion<T> cosh(quaternion<T> const & q);
818 Computes the hyperbolic cosine of the quaternion.
822 template<typename T> quaternion<T> sinh(quaternion<T> const & q);
824 Computes the hyperbolic sine of the quaternion.
828 template<typename T> quaternion<T> tanh(quaternion<T> const & q);
830 Computes the hyperbolic tangent of the quaternion.
834 template<typename T> quaternion<T> pow(quaternion<T> const & q, int n);
836 Computes the n-th power of the quaternion q.
838 [endsect] [/section:trans Quaternion Transcendentals]
840 [section:quat_tests Test Program]
842 The [@../../test/quaternion_test.cpp quaternion_test.cpp]
843 test program tests quaternions specializations for float, double and long double
844 ([@../quaternion/output.txt sample output], with message output
847 If you define the symbol TEST_VERBOSE, you will get
848 additional output ([@../quaternion/output_more.txt verbose output]);
849 this will only be helpfull if you enable message output at the same time,
850 of course (by uncommenting the relevant line in the test or by adding
851 [^--log_level=messages] to your command line,...). In that case, and if you
852 are running interactively, you may in addition define the symbol
853 BOOST_INTERACTIVE_TEST_INPUT_ITERATOR to interactively test the input
854 operator with input of your choice from the standard input
855 (instead of hard-coding it in the test).
857 [endsect] [/section:quat_tests Test Program]
859 [section:exp The Quaternionic Exponential]
861 Please refer to the following PDF's:
863 *[@../quaternion/TQE.pdf The Quaternionic Exponential (and beyond)]
864 *[@../quaternion/TQE_EA.pdf The Quaternionic Exponential (and beyond) ERRATA & ADDENDA]
866 [endsect] [/section:exp The Quaternionic Exponential]
869 [section:acknowledgement Acknowledgements]
871 The mathematical text has been typeset with
872 [@http://www.nisus-soft.com/ Nisus Writer]. Jens Maurer has helped with
873 portability and standard adherence, and was the Review Manager
874 for this library. More acknowledgements in the History section.
875 Thank you to all who contributed to the discution about this library.
877 [endsect] [/section:quat_tests Test Program]
879 [section:quat_history History]
881 * 1.5.9 - 13/5/2013: Incorporated into Boost.Math.
882 * 1.5.8 - 17/12/2005: Converted documentation to Quickbook Format.
883 * 1.5.7 - 24/02/2003: transitionned to the unit test framework; <boost/config.hpp> now included by the library header (rather than the test files).
884 * 1.5.6 - 15/10/2002: Gcc2.95.x and stlport on linux compatibility by Alkis Evlogimenos (alkis@routescience.com).
885 * 1.5.5 - 27/09/2002: Microsoft VCPP 7 compatibility, by Michael Stevens (michael@acfr.usyd.edu.au); requires the /Za compiler option.
886 * 1.5.4 - 19/09/2002: fixed problem with multiple inclusion (in different translation units); attempt at an improved compatibility with Microsoft compilers, by Michael Stevens (michael@acfr.usyd.edu.au) and Fredrik Blomqvist; other compatibility fixes.
887 * 1.5.3 - 01/02/2002: bugfix and Gcc 2.95.3 compatibility by Douglas Gregor (gregod@cs.rpi.edu).
888 * 1.5.2 - 07/07/2001: introduced namespace math.
889 * 1.5.1 - 07/06/2001: (end of Boost review) now includes <boost/math/special_functions/sinc.hpp> and <boost/math/special_functions/sinhc.hpp> instead of <boost/special_functions.hpp>; corrected bug in sin (Daryle Walker); removed check for self-assignment (Gary Powel); made converting functions explicit (Gary Powel); added overflow guards for division operators and abs (Peter Schmitteckert); added sup and l1; used Vesa Karvonen's CPP metaprograming technique to simplify code.
890 * 1.5.0 - 26/03/2001: boostification, inlining of all operators except input, output and pow, fixed exception safety of some members (template version) and output operator, added spherical, semipolar, multipolar, cylindrospherical and cylindrical.
891 * 1.4.0 - 09/01/2001: added tan and tanh.
892 * 1.3.1 - 08/01/2001: cosmetic fixes.
893 * 1.3.0 - 12/07/2000: pow now uses Maarten Hilferink's (mhilferink@tip.nl) algorithm.
894 * 1.2.0 - 25/05/2000: fixed the division operators and output; changed many signatures.
895 * 1.1.0 - 23/05/2000: changed sinc into sinc_pi; added sin, cos, sinh, cosh.
896 * 1.0.0 - 10/08/1999: first public version.
898 [endsect] [/section:quat_history History]
900 [section:quat_todo To Do]
903 * Rewrite input operatore using Spirit (creates a dependency).
904 * Put in place an Expression Template mechanism (perhaps borrowing from uBlas).
905 * Use uBlas for the link with rotations (and move from the
906 [@../../example/HSO3SO4.cpp example]
907 implementation to an efficient one).
909 [endsect] [/section:quat_todo To Do]
911 [endmathpart] [/mathpart quaternions Quaternions]
914 Copyright 1999, 2005, 2013 Hubert Holin.
915 Distributed under the Boost Software License, Version 1.0.
916 (See accompanying file LICENSE_1_0.txt or copy at
917 http://www.boost.org/LICENSE_1_0.txt).