5
5
Complex (x:: Real , y:: Real ) = Complex (promote (x,y)... )
6
6
Complex (x:: Real ) = Complex (x, zero (x))
7
7
8
+ const im = Complex (false ,true )
9
+
8
10
typealias Complex128 Complex{Float64}
9
11
typealias Complex64 Complex{Float32}
10
12
typealias Complex32 Complex{Float16}
11
13
12
- sizeof (:: Type{Complex128} ) = 16
13
- sizeof (:: Type{Complex64} ) = 8
14
- sizeof (:: Type{Complex32} ) = 4
14
+ sizeof {T<:Real} (:: Type{Complex{T}} ) = 2 * sizeof (T)
15
15
16
- real (z :: Complex ) = z . re
17
- imag ( z:: Complex ) = z . im
18
- real (x :: Real ) = x
19
- imag (x :: Real ) = zero (x )
16
+ convert {T<:Real} ( :: Type{ Complex{T}} , x :: Real ) = Complex {T} (x, 0 )
17
+ convert {T<:Real} ( :: Type{Complex{T}} , z:: Complex ) = Complex {T} ( real (z), imag (z))
18
+ convert {T<:Real} ( :: Type{T} , z :: Complex ) =
19
+ isreal (z) ? convert (T, real (z)) : throw ( InexactError () )
20
20
21
- convert {T<:Real} (:: Type{Complex{T}} , x:: Real ) =
22
- Complex {T} (convert (T,x), convert (T,0 ))
23
- convert {T<:Real} (:: Type{Complex{T}} , z:: Complex{T} ) = z
24
- convert {T<:Real} (:: Type{Complex{T}} , z:: Complex ) =
25
- Complex {T} (convert (T,real (z)),convert (T,imag (z)))
26
-
27
- convert {T<:Real} (:: Type{T} , z:: Complex ) = (imag (z)== 0 ? convert (T,real (z)) :
28
- throw (InexactError ()))
21
+ convert (:: Type{Complex} , z:: Complex ) = z
22
+ convert (:: Type{Complex} , x:: Real ) = Complex (x)
29
23
30
24
promote_rule {T<:Real,S<:Real} (:: Type{Complex{T}} , :: Type{S} ) =
31
25
Complex{promote_type (T,S)}
32
26
promote_rule {T<:Real,S<:Real} (:: Type{Complex{T}} , :: Type{Complex{S}} ) =
33
27
Complex{promote_type (T,S)}
34
28
35
- complex (x, y) = Complex (x, y)
36
- complex (x) = Complex (x)
29
+ real (z:: Complex ) = z. re
30
+ imag (z:: Complex ) = z. im
31
+ real (x:: Real ) = x
32
+ imag (x:: Real ) = zero (x)
33
+ reim (z) = (real (z), imag (z))
34
+
35
+ isreal (x:: Real ) = true
36
+ isreal (z:: Complex ) = imag (z) == 0
37
+ isimag (z:: Number ) = real (z) == 0
38
+ isinteger (z:: Complex ) = isreal (z) && isinteger (real (z))
39
+ isfinite (z:: Complex ) = isfinite (real (z)) && isfinite (imag (z))
40
+
41
+ complex (x:: Real , y:: Real ) = Complex (x, y)
42
+ complex (x:: Real ) = Complex (x)
37
43
complex (z:: Complex ) = z
38
44
39
45
complex128 (r:: Float64 , i:: Float64 ) = Complex {Float64} (r, i)
@@ -50,32 +56,23 @@ for fn in _numeric_conversion_func_names
50
56
@eval $ fn (z:: Complex ) = complex ($ fn (real (z)),$ fn (imag (z)))
51
57
end
52
58
53
- isreal {T<:Real} (z:: Complex{T} ) = imag (z) == 0
54
- isinteger (z:: Complex ) = isreal (z) && isinteger (real (z))
55
-
56
- isfinite (z:: Complex ) = isfinite (real (z)) && isfinite (imag (z))
57
- reim (z) = (real (z), imag (z))
58
-
59
59
function complex_show (io:: IO , z:: Complex , compact:: Bool )
60
60
r, i = reim (z)
61
- if isnan (r) || isfinite (i)
62
- compact ? showcompact (io,r) : show (io,r)
63
- if signbit (i)== 1 && ! isnan (i)
64
- i = - i
65
- print (io, compact ? " -" : " - " )
66
- else
67
- print (io, compact ? " +" : " + " )
68
- end
69
- compact ? showcompact (io, i) : show (io, i)
70
- if ! (isa (i,Integer) || isa (i,Rational) ||
71
- isa (i,FloatingPoint) && isfinite (i))
72
- print (io, " *" )
73
- end
74
- print (io, " im" )
61
+ compact ? showcompact (io,r) : show (io,r)
62
+ if signbit (i)== 1 && ! isnan (i)
63
+ i = - i
64
+ print (io, compact ? " -" : " - " )
75
65
else
76
- print (io, " complex(" ,r," ," ,i," )" )
66
+ print (io, compact ? " +" : " + " )
67
+ end
68
+ compact ? showcompact (io, i) : show (io, i)
69
+ if ! (isa (i,Integer) && ! isa (i,Bool) || isa (i,FloatingPoint) && isfinite (i))
70
+ print (io, " *" )
77
71
end
72
+ print (io, " im" )
78
73
end
74
+ complex_show (io:: IO , z:: Complex{Bool} , compact:: Bool ) =
75
+ print (io, z == im ? " im" : " Complex($(z. re) ,$(z. im) )" )
79
76
show (io:: IO , z:: Complex ) = complex_show (io, z, false )
80
77
showcompact (io:: IO , z:: Complex ) = complex_show (io, z, true )
81
78
@@ -90,28 +87,8 @@ function write(s::IO, z::Complex)
90
87
end
91
88
92
89
93
- # # singleton type for imaginary unit constant ##
94
-
95
- type ImaginaryUnit <: Number end
96
- const im = ImaginaryUnit ()
97
-
98
- convert {T<:Real} (:: Type{Complex{T}} , :: ImaginaryUnit ) = Complex {T} (zero (T),one (T))
99
- convert (:: Type{Complex} , :: ImaginaryUnit ) = Complex (real (im),imag (im))
100
-
101
- real (:: ImaginaryUnit ) = int (0 )
102
- imag (:: ImaginaryUnit ) = int (1 )
103
-
104
- promote_rule {T<:Complex} (:: Type{ImaginaryUnit} , :: Type{T} ) = T
105
- promote_rule {T<:Real} (:: Type{ImaginaryUnit} , :: Type{T} ) = Complex{T}
106
-
107
- show (io:: IO , :: ImaginaryUnit ) = print (io, " im" )
108
-
109
-
110
90
# # generic functions of complex numbers ##
111
91
112
- convert (:: Type{Complex} , z:: Complex ) = z
113
- convert (:: Type{Complex} , x:: Real ) = complex (x)
114
-
115
92
== (z:: Complex , w:: Complex ) = (real (z) == real (w)) & (imag (z) == imag (w))
116
93
== (z:: Complex , x:: Real ) = isreal (z) && real (z) == x
117
94
== (x:: Real , z:: Complex ) = isreal (z) && real (z) == x
@@ -127,28 +104,22 @@ inv(z::Complex) = conj(z)/abs2(z)
127
104
inv {T<:Integer} (z:: Complex{T} ) = inv (float (z))
128
105
sign (z:: Complex ) = z/ abs (z)
129
106
130
- (- )(:: ImaginaryUnit ) = complex (0 , - 1 )
131
107
- (z:: Complex ) = complex (- real (z), - imag (z))
132
108
+ (z:: Complex , w:: Complex ) = complex (real (z) + real (w), imag (z) + imag (w))
133
109
- (z:: Complex , w:: Complex ) = complex (real (z) - real (w), imag (z) - imag (w))
134
110
* (z:: Complex , w:: Complex ) = complex (real (z) * real (w) - imag (z) * imag (w),
135
111
real (z) * imag (w) + imag (z) * real (w))
136
112
137
113
# adding or multiplying real & complex is common
114
+ * (x:: Bool , z:: Complex ) = ifelse (x, z, zero (z))
115
+ * (z:: Complex , x:: Bool ) = ifelse (x, z, zero (z))
138
116
* (x:: Real , z:: Complex ) = complex (x * real (z), x * imag (z))
139
117
* (z:: Complex , x:: Real ) = complex (x * real (z), x * imag (z))
140
118
+ (x:: Real , z:: Complex ) = complex (x + real (z), imag (z))
141
119
+ (z:: Complex , x:: Real ) = complex (x + real (z), imag (z))
142
120
- (x:: Real , z:: Complex ) = complex (x - real (z), - imag (z))
143
121
- (z:: Complex , x:: Real ) = complex (real (z) - x, imag (z))
144
122
145
- # multiplying by im is common
146
- * (z:: ImaginaryUnit , w:: ImaginaryUnit ) = complex (- imag (z), real (z))
147
- * (z:: ImaginaryUnit , x:: Real ) = complex (zero (x), x)
148
- * (x:: Real , z:: ImaginaryUnit ) = complex (zero (x), x)
149
- * (z:: ImaginaryUnit , w:: Complex ) = complex (- imag (w), real (w))
150
- * (w:: Complex , z:: ImaginaryUnit ) = complex (- imag (w), real (w))
151
-
152
123
/ (z:: Number , w:: Complex ) = z* inv (w)
153
124
/ (a:: Real , w:: Complex ) = a* inv (w)
154
125
/ (z:: Complex , x:: Real ) = complex (real (z)/ x, imag (z)/ x)
0 commit comments