1
import Base: promote_rule, convert
1
import Base: convert, promote_rule, show, real, imag, conj, abs, abs2, inv, +, -, /, *
3
3
immutable Quaternion{T<:Real} <: Number
10
Quaternion(q0::Real,q1::Real,q2::Real,q3::Real) = Quaternion(promote(q0,q1,q2,q3)...)
10
12
convert{T}(::Type{Quaternion{T}}, x::Real) =
11
Quaternion(convert(T,x), convert(T,0), convert(T,0), convert(T,0))
13
Quaternion(convert(T,x), zero(T), zero(T), zero(T))
13
14
convert{T}(::Type{Quaternion{T}}, z::Complex) =
14
Quaternion(convert(T,real(z)), convert(T,imag(z)), convert(T,0), convert(T,0))
15
Quaternion(convert(T,real(z)), convert(T,imag(z)), zero(T), zero(T))
16
16
convert{T}(::Type{Quaternion{T}}, z::Quaternion) =
17
Quaternion(convert(T,z.q0), convert(T,z.q1),
18
convert(T,z.q2), convert(T,z.q3))
17
Quaternion(convert(T,z.q0), convert(T,z.q1), convert(T,z.q2), convert(T,z.q3))
20
promote_rule{T,S}(::Type{Complex{T}}, ::Type{Quaternion{S}}) =
21
Quaternion{promote_type(T,S)}
19
promote_rule{T,S}(::Type{Complex{T}}, ::Type{Quaternion{S}}) = Quaternion{promote_type(T,S)}
22
20
promote_rule{S}(::Type{Bool}, ::Type{Quaternion{S}}) = Quaternion{S}
23
promote_rule{T<:Real,S}(::Type{T}, ::Type{Quaternion{S}}) =
24
Quaternion{promote_type(T,S)}
21
promote_rule{T<:Real,S}(::Type{T}, ::Type{Quaternion{S}}) = Quaternion{promote_type(T,S)}
22
promote_rule{T,S}(::Type{Quaternion{T}}, ::Type{Quaternion{S}}) = Quaternion{promote_type(T,S)}
26
24
function show(io::IO, z::Quaternion)
25
pm(x) = x < 0 ? " - $(-x)" : " + $x"
26
print(io, z.q0, pm(z.q1), "i", pm(z.q2), "j", pm(z.q3), "k")
57
29
real(z::Quaternion) = z.q0