24
24
Complex32 * = Complex [float32 ]
25
25
# # Alias for a pair of 32-bit floats.
26
26
27
- proc complex * [T: SomeFloat ](re: T; im: T = 0.0 ): Complex [T] =
27
+ func complex * [T: SomeFloat ](re: T; im: T = 0.0 ): Complex [T] =
28
28
result .re = re
29
29
result .im = im
30
30
31
- proc complex32 * (re: float32 ; im: float32 = 0.0 ): Complex [float32 ] =
31
+ func complex32 * (re: float32 ; im: float32 = 0.0 ): Complex [float32 ] =
32
32
result .re = re
33
33
result .im = im
34
34
35
- proc complex64 * (re: float64 ; im: float64 = 0.0 ): Complex [float64 ] =
35
+ func complex64 * (re: float64 ; im: float64 = 0.0 ): Complex [float64 ] =
36
36
result .re = re
37
37
result .im = im
38
38
@@ -41,71 +41,71 @@ template im*(arg: typedesc[float64]): Complex64 = complex[float64](0, 1)
41
41
template im * (arg: float32 ): Complex32 = complex [float32 ](0 , arg)
42
42
template im * (arg: float64 ): Complex64 = complex [float64 ](0 , arg)
43
43
44
- proc abs * [T](z: Complex [T]): T =
44
+ func abs * [T](z: Complex [T]): T =
45
45
# # Returns the distance from (0,0) to ``z``.
46
46
result = hypot (z.re, z.im)
47
47
48
- proc abs2 * [T](z: Complex [T]): T =
48
+ func abs2 * [T](z: Complex [T]): T =
49
49
# # Returns the squared distance from (0,0) to ``z``.
50
50
result = z.re* z.re + z.im* z.im
51
51
52
- proc conjugate * [T](z: Complex [T]): Complex [T] =
52
+ func conjugate * [T](z: Complex [T]): Complex [T] =
53
53
# # Conjugates of complex number ``z``.
54
54
result .re = z.re
55
55
result .im = - z.im
56
56
57
- proc inv * [T](z: Complex [T]): Complex [T] =
57
+ func inv * [T](z: Complex [T]): Complex [T] =
58
58
# # Multiplicatives inverse of complex number ``z``.
59
59
conjugate (z) / abs2 (z)
60
60
61
- proc `==` * [T](x, y: Complex [T]): bool =
61
+ func `==` * [T](x, y: Complex [T]): bool =
62
62
# # Compares two complex numbers ``x`` and ``y`` for equality.
63
63
result = x.re == y.re and x.im == y.im
64
64
65
- proc `+` * [T](x: T; y: Complex [T]): Complex [T] =
65
+ func `+` * [T](x: T; y: Complex [T]): Complex [T] =
66
66
# # Adds a real number to a complex number.
67
67
result .re = x + y.re
68
68
result .im = y.im
69
69
70
- proc `+` * [T](x: Complex [T]; y: T): Complex [T] =
70
+ func `+` * [T](x: Complex [T]; y: T): Complex [T] =
71
71
# # Adds a complex number to a real number.
72
72
result .re = x.re + y
73
73
result .im = x.im
74
74
75
- proc `+` * [T](x, y: Complex [T]): Complex [T] =
75
+ func `+` * [T](x, y: Complex [T]): Complex [T] =
76
76
# # Adds two complex numbers.
77
77
result .re = x.re + y.re
78
78
result .im = x.im + y.im
79
79
80
- proc `-` * [T](z: Complex [T]): Complex [T] =
80
+ func `-` * [T](z: Complex [T]): Complex [T] =
81
81
# # Unary minus for complex numbers.
82
82
result .re = - z.re
83
83
result .im = - z.im
84
84
85
- proc `-` * [T](x: T; y: Complex [T]): Complex [T] =
85
+ func `-` * [T](x: T; y: Complex [T]): Complex [T] =
86
86
# # Subtracts a complex number from a real number.
87
87
x + (- y)
88
88
89
- proc `-` * [T](x: Complex [T]; y: T): Complex [T] =
89
+ func `-` * [T](x: Complex [T]; y: T): Complex [T] =
90
90
# # Subtracts a real number from a complex number.
91
91
result .re = x.re - y
92
92
result .im = x.im
93
93
94
- proc `-` * [T](x, y: Complex [T]): Complex [T] =
94
+ func `-` * [T](x, y: Complex [T]): Complex [T] =
95
95
# # Subtracts two complex numbers.
96
96
result .re = x.re - y.re
97
97
result .im = x.im - y.im
98
98
99
- proc `/` * [T](x: Complex [T]; y: T): Complex [T] =
99
+ func `/` * [T](x: Complex [T]; y: T): Complex [T] =
100
100
# # Divides complex number ``x`` by real number ``y``.
101
101
result .re = x.re / y
102
102
result .im = x.im / y
103
103
104
- proc `/` * [T](x: T; y: Complex [T]): Complex [T] =
104
+ func `/` * [T](x: T; y: Complex [T]): Complex [T] =
105
105
# # Divides real number ``x`` by complex number ``y``.
106
106
result = x * inv (y)
107
107
108
- proc `/` * [T](x, y: Complex [T]): Complex [T] =
108
+ func `/` * [T](x, y: Complex [T]): Complex [T] =
109
109
# # Divides ``x`` by ``y``.
110
110
var r, den: T
111
111
if abs (y.re) < abs (y.im):
@@ -119,44 +119,44 @@ proc `/` *[T](x, y: Complex[T]): Complex[T] =
119
119
result .re = (x.re + r * x.im) / den
120
120
result .im = (x.im - r * x.re) / den
121
121
122
- proc `*` * [T](x: T; y: Complex [T]): Complex [T] =
122
+ func `*` * [T](x: T; y: Complex [T]): Complex [T] =
123
123
# # Multiplies a real number and a complex number.
124
124
result .re = x * y.re
125
125
result .im = x * y.im
126
126
127
- proc `*` * [T](x: Complex [T]; y: T): Complex [T] =
127
+ func `*` * [T](x: Complex [T]; y: T): Complex [T] =
128
128
# # Multiplies a complex number with a real number.
129
129
result .re = x.re * y
130
130
result .im = x.im * y
131
131
132
- proc `*` * [T](x, y: Complex [T]): Complex [T] =
132
+ func `*` * [T](x, y: Complex [T]): Complex [T] =
133
133
# # Multiplies ``x`` with ``y``.
134
134
result .re = x.re * y.re - x.im * y.im
135
135
result .im = x.im * y.re + x.re * y.im
136
136
137
137
138
- proc `+=` * [T](x: var Complex [T]; y: Complex [T]) =
138
+ func `+=` * [T](x: var Complex [T]; y: Complex [T]) =
139
139
# # Adds ``y`` to ``x``.
140
140
x.re += y.re
141
141
x.im += y.im
142
142
143
- proc `-=` * [T](x: var Complex [T]; y: Complex [T]) =
143
+ func `-=` * [T](x: var Complex [T]; y: Complex [T]) =
144
144
# # Subtracts ``y`` from ``x``.
145
145
x.re -= y.re
146
146
x.im -= y.im
147
147
148
- proc `*=` * [T](x: var Complex [T]; y: Complex [T]) =
148
+ func `*=` * [T](x: var Complex [T]; y: Complex [T]) =
149
149
# # Multiplies ``y`` to ``x``.
150
150
let im = x.im * y.re + x.re * y.im
151
151
x.re = x.re * y.re - x.im * y.im
152
152
x.im = im
153
153
154
- proc `/=` * [T](x: var Complex [T]; y: Complex [T]) =
154
+ func `/=` * [T](x: var Complex [T]; y: Complex [T]) =
155
155
# # Divides ``x`` by ``y`` in place.
156
156
x = x / y
157
157
158
158
159
- proc sqrt * [T](z: Complex [T]): Complex [T] =
159
+ func sqrt * [T](z: Complex [T]): Complex [T] =
160
160
# # Square root for a complex number ``z``.
161
161
var x, y, w, r: T
162
162
@@ -179,28 +179,28 @@ proc sqrt*[T](z: Complex[T]): Complex[T] =
179
179
result .im = if z.im >= 0.0 : w else : - w
180
180
result .re = z.im / (result .im + result .im)
181
181
182
- proc exp * [T](z: Complex [T]): Complex [T] =
182
+ func exp * [T](z: Complex [T]): Complex [T] =
183
183
# # ``e`` raised to the power ``z``.
184
184
var
185
185
rho = exp (z.re)
186
186
theta = z.im
187
187
result .re = rho * cos (theta)
188
188
result .im = rho * sin (theta)
189
189
190
- proc ln * [T](z: Complex [T]): Complex [T] =
190
+ func ln * [T](z: Complex [T]): Complex [T] =
191
191
# # Returns the natural log of ``z``.
192
192
result .re = ln (abs (z))
193
193
result .im = arctan2 (z.im, z.re)
194
194
195
- proc log10 * [T](z: Complex [T]): Complex [T] =
195
+ func log10 * [T](z: Complex [T]): Complex [T] =
196
196
# # Returns the log base 10 of ``z``.
197
197
result = ln (z) / ln (10.0 )
198
198
199
- proc log2 * [T](z: Complex [T]): Complex [T] =
199
+ func log2 * [T](z: Complex [T]): Complex [T] =
200
200
# # Returns the log base 2 of ``z``.
201
201
result = ln (z) / ln (2.0 )
202
202
203
- proc pow * [T](x, y: Complex [T]): Complex [T] =
203
+ func pow * [T](x, y: Complex [T]): Complex [T] =
204
204
# # ``x`` raised to the power ``y``.
205
205
if x.re == 0.0 and x.im == 0.0 :
206
206
if y.re == 0.0 and y.im == 0.0 :
@@ -222,126 +222,126 @@ proc pow*[T](x, y: Complex[T]): Complex[T] =
222
222
result .re = s * cos (r)
223
223
result .im = s * sin (r)
224
224
225
- proc pow * [T](x: Complex [T]; y: T): Complex [T] =
225
+ func pow * [T](x: Complex [T]; y: T): Complex [T] =
226
226
# # Complex number ``x`` raised to the power ``y``.
227
227
pow (x, complex [T](y))
228
228
229
229
230
- proc sin * [T](z: Complex [T]): Complex [T] =
230
+ func sin * [T](z: Complex [T]): Complex [T] =
231
231
# # Returns the sine of ``z``.
232
232
result .re = sin (z.re) * cosh (z.im)
233
233
result .im = cos (z.re) * sinh (z.im)
234
234
235
- proc arcsin * [T](z: Complex [T]): Complex [T] =
235
+ func arcsin * [T](z: Complex [T]): Complex [T] =
236
236
# # Returns the inverse sine of ``z``.
237
237
result = - im (T) * ln (im (T) * z + sqrt (T (1.0 ) - z* z))
238
238
239
- proc cos * [T](z: Complex [T]): Complex [T] =
239
+ func cos * [T](z: Complex [T]): Complex [T] =
240
240
# # Returns the cosine of ``z``.
241
241
result .re = cos (z.re) * cosh (z.im)
242
242
result .im = - sin (z.re) * sinh (z.im)
243
243
244
- proc arccos * [T](z: Complex [T]): Complex [T] =
244
+ func arccos * [T](z: Complex [T]): Complex [T] =
245
245
# # Returns the inverse cosine of ``z``.
246
246
result = - im (T) * ln (z + sqrt (z* z - T (1.0 )))
247
247
248
- proc tan * [T](z: Complex [T]): Complex [T] =
248
+ func tan * [T](z: Complex [T]): Complex [T] =
249
249
# # Returns the tangent of ``z``.
250
250
result = sin (z) / cos (z)
251
251
252
- proc arctan * [T](z: Complex [T]): Complex [T] =
252
+ func arctan * [T](z: Complex [T]): Complex [T] =
253
253
# # Returns the inverse tangent of ``z``.
254
254
result = T (0.5 )* im (T) * (ln (T (1.0 ) - im (T)* z) - ln (T (1.0 ) + im (T)* z))
255
255
256
- proc cot * [T](z: Complex [T]): Complex [T] =
256
+ func cot * [T](z: Complex [T]): Complex [T] =
257
257
# # Returns the cotangent of ``z``.
258
258
result = cos (z)/ sin (z)
259
259
260
- proc arccot * [T](z: Complex [T]): Complex [T] =
260
+ func arccot * [T](z: Complex [T]): Complex [T] =
261
261
# # Returns the inverse cotangent of ``z``.
262
262
result = T (0.5 )* im (T) * (ln (T (1.0 ) - im (T)/ z) - ln (T (1.0 ) + im (T)/ z))
263
263
264
- proc sec * [T](z: Complex [T]): Complex [T] =
264
+ func sec * [T](z: Complex [T]): Complex [T] =
265
265
# # Returns the secant of ``z``.
266
266
result = T (1.0 ) / cos (z)
267
267
268
- proc arcsec * [T](z: Complex [T]): Complex [T] =
268
+ func arcsec * [T](z: Complex [T]): Complex [T] =
269
269
# # Returns the inverse secant of ``z``.
270
270
result = - im (T) * ln (im (T) * sqrt (1.0 - 1.0 / (z* z)) + T (1.0 )/ z)
271
271
272
- proc csc * [T](z: Complex [T]): Complex [T] =
272
+ func csc * [T](z: Complex [T]): Complex [T] =
273
273
# # Returns the cosecant of ``z``.
274
274
result = T (1.0 ) / sin (z)
275
275
276
- proc arccsc * [T](z: Complex [T]): Complex [T] =
276
+ func arccsc * [T](z: Complex [T]): Complex [T] =
277
277
# # Returns the inverse cosecant of ``z``.
278
278
result = - im (T) * ln (sqrt (T (1.0 ) - T (1.0 )/ (z* z)) + im (T)/ z)
279
279
280
- proc sinh * [T](z: Complex [T]): Complex [T] =
280
+ func sinh * [T](z: Complex [T]): Complex [T] =
281
281
# # Returns the hyperbolic sine of ``z``.
282
282
result = T (0.5 ) * (exp (z) - exp (- z))
283
283
284
- proc arcsinh * [T](z: Complex [T]): Complex [T] =
284
+ func arcsinh * [T](z: Complex [T]): Complex [T] =
285
285
# # Returns the inverse hyperbolic sine of ``z``.
286
286
result = ln (z + sqrt (z* z + 1.0 ))
287
287
288
- proc cosh * [T](z: Complex [T]): Complex [T] =
288
+ func cosh * [T](z: Complex [T]): Complex [T] =
289
289
# # Returns the hyperbolic cosine of ``z``.
290
290
result = T (0.5 ) * (exp (z) + exp (- z))
291
291
292
- proc arccosh * [T](z: Complex [T]): Complex [T] =
292
+ func arccosh * [T](z: Complex [T]): Complex [T] =
293
293
# # Returns the inverse hyperbolic cosine of ``z``.
294
294
result = ln (z + sqrt (z* z - T (1.0 )))
295
295
296
- proc tanh * [T](z: Complex [T]): Complex [T] =
296
+ func tanh * [T](z: Complex [T]): Complex [T] =
297
297
# # Returns the hyperbolic tangent of ``z``.
298
298
result = sinh (z) / cosh (z)
299
299
300
- proc arctanh * [T](z: Complex [T]): Complex [T] =
300
+ func arctanh * [T](z: Complex [T]): Complex [T] =
301
301
# # Returns the inverse hyperbolic tangent of ``z``.
302
302
result = T (0.5 ) * (ln ((T (1.0 )+ z) / (T (1.0 )- z)))
303
303
304
- proc sech * [T](z: Complex [T]): Complex [T] =
304
+ func sech * [T](z: Complex [T]): Complex [T] =
305
305
# # Returns the hyperbolic secant of ``z``.
306
306
result = T (2.0 ) / (exp (z) + exp (- z))
307
307
308
- proc arcsech * [T](z: Complex [T]): Complex [T] =
308
+ func arcsech * [T](z: Complex [T]): Complex [T] =
309
309
# # Returns the inverse hyperbolic secant of ``z``.
310
310
result = ln (1.0 / z + sqrt (T (1.0 )/ z+ T (1.0 )) * sqrt (T (1.0 )/ z- T (1.0 )))
311
311
312
- proc csch * [T](z: Complex [T]): Complex [T] =
312
+ func csch * [T](z: Complex [T]): Complex [T] =
313
313
# # Returns the hyperbolic cosecant of ``z``.
314
314
result = T (2.0 ) / (exp (z) - exp (- z))
315
315
316
- proc arccsch * [T](z: Complex [T]): Complex [T] =
316
+ func arccsch * [T](z: Complex [T]): Complex [T] =
317
317
# # Returns the inverse hyperbolic cosecant of ``z``.
318
318
result = ln (T (1.0 )/ z + sqrt (T (1.0 )/ (z* z) + T (1.0 )))
319
319
320
- proc coth * [T](z: Complex [T]): Complex [T] =
320
+ func coth * [T](z: Complex [T]): Complex [T] =
321
321
# # Returns the hyperbolic cotangent of ``z``.
322
322
result = cosh (z) / sinh (z)
323
323
324
- proc arccoth * [T](z: Complex [T]): Complex [T] =
324
+ func arccoth * [T](z: Complex [T]): Complex [T] =
325
325
# # Returns the inverse hyperbolic cotangent of ``z``.
326
326
result = T (0.5 ) * (ln (T (1.0 ) + T (1.0 )/ z) - ln (T (1.0 ) - T (1.0 )/ z))
327
327
328
- proc phase * [T](z: Complex [T]): T =
328
+ func phase * [T](z: Complex [T]): T =
329
329
# # Returns the phase of ``z``.
330
330
arctan2 (z.im, z.re)
331
331
332
- proc polar * [T](z: Complex [T]): tuple [r, phi: T] =
332
+ func polar * [T](z: Complex [T]): tuple [r, phi: T] =
333
333
# # Returns ``z`` in polar coordinates.
334
334
(r: abs (z), phi: phase (z))
335
335
336
- proc rect * [T](r, phi: T): Complex [T] =
336
+ func rect * [T](r, phi: T): Complex [T] =
337
337
# # Returns the complex number with polar coordinates ``r`` and ``phi``.
338
338
# #
339
339
# # | ``result.re = r * cos(phi)``
340
340
# # | ``result.im = r * sin(phi)``
341
341
complex (r * cos (phi), r * sin (phi))
342
342
343
343
344
- proc `$` * (z: Complex ): string =
344
+ func `$` * (z: Complex ): string =
345
345
# # Returns ``z``'s string representation as ``"(re, im)"``.
346
346
result = " (" & $ z.re & " , " & $ z.im & " )"
347
347
0 commit comments