~ubuntu-branches/ubuntu/wily/julia/wily

« back to all changes in this revision

Viewing changes to examples/quaternion.jl

  • Committer: Package Import Robot
  • Author(s): Sébastien Villemot
  • Date: 2013-11-17 19:32:52 UTC
  • mfrom: (1.1.12)
  • Revision ID: package-import@ubuntu.com-20131117193252-tkrpclguqqebqa35
Tags: 0.2.0+dfsg-3
testsuite-i386.patch: loosen the numerical precision for yet another test.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import Base: promote_rule, convert
 
1
import Base: convert, promote_rule, show, real, imag, conj, abs, abs2, inv, +, -, /, *
2
2
 
3
3
immutable Quaternion{T<:Real} <: Number
4
4
    q0::T
7
7
    q3::T
8
8
end
9
9
 
 
10
Quaternion(q0::Real,q1::Real,q2::Real,q3::Real) = Quaternion(promote(q0,q1,q2,q3)...)
 
11
 
10
12
convert{T}(::Type{Quaternion{T}}, x::Real) =
11
 
    Quaternion(convert(T,x), convert(T,0), convert(T,0), convert(T,0))
12
 
 
 
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
 
 
 
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))
19
18
 
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)}
25
23
 
26
24
function show(io::IO, z::Quaternion)
27
 
    show(io, z.q0)
28
 
    i = z.q1
29
 
    if sign(i) == -1
30
 
        i = -i
31
 
        print(io, " - ")
32
 
    else
33
 
        print(io, " + ")
34
 
    end
35
 
    show(io, i)
36
 
    print(io, "i")
37
 
    j = z.q2
38
 
    if sign(j) == -1
39
 
        j = -j
40
 
        print(io, " - ")
41
 
    else
42
 
        print(io, " + ")
43
 
    end
44
 
    show(io, j)
45
 
    print(io, "j")
46
 
    k = z.q3
47
 
    if sign(k) == -1
48
 
        k = -k
49
 
        print(io, " - ")
50
 
    else
51
 
        print(io, " + ")
52
 
    end
53
 
    show(io, k)
54
 
    print(io, "k")
 
25
    pm(x) = x < 0 ? " - $(-x)" : " + $x"
 
26
    print(io, z.q0, pm(z.q1), "i", pm(z.q2), "j", pm(z.q3), "k")
55
27
end
56
28
 
57
29
real(z::Quaternion) = z.q0
81
53
 
82
54
println("q = $q")
83
55
println("q*2.0+2 = $(q*2.0+2)")
84
 
println("abs((-q+x*2)/4) = $repr(abs((-q+x*2)/4))")
85
 
 
 
56
println("abs((-q+x*2)/4) = ", abs((-q+x*2)/4))