4
cimport libcpp.complex as cppcomplex
5
from libcpp.complex cimport complex as complex_class
7
def double_complex(complex_class[double] a):
9
>>> double_complex(1 + 2j)
11
>>> double_complex(1.5 + 2.5j)
16
def double_int(complex_class[int] a):
18
>>> double_int(1 + 2j)
20
>>> double_int(1.5 + 2.5j)
25
def double_addition_with_scalar(complex_class[double] a, double b):
27
>>> double_addition_with_scalar(1 + 1j, 1) + 1
29
>>> 1 + double_addition_with_scalar(1 + 2j, -1)
31
>>> 1j + double_addition_with_scalar(1 + 2j, 7)
33
>>> double_addition_with_scalar(1 + 2j, 7) - 1j
35
>>> double_addition_with_scalar(1.5 + 2.5j, -1) + 0
37
>>> -0 + double_addition_with_scalar(1.5 + 2.5j, -1)
40
cdef complex_class[double] c = a + b
41
cdef complex_class[double] d = b + a
44
def double_inplace_addition_with_scalar(complex_class[double] a, double b):
46
>>> double_inplace_addition_with_scalar(1 + 1j, 1)
52
def double_inplace_substraction_with_scalar(complex_class[double] a, double b):
54
>>> double_inplace_substraction_with_scalar(1 + 1j, 2)
60
def double_inplace_multiplication_with_scalar(complex_class[double] a, double b):
62
>>> double_inplace_multiplication_with_scalar(1 + 1j, 2)
68
def double_inplace_division_with_scalar(complex_class[double] a, double b):
70
>>> double_inplace_division_with_scalar(3 + 3j, 2)
76
def double_unary_negation(complex_class[double] a):
78
>>> double_unary_negation(2 + 2j)
83
def double_unary_positive(complex_class[double] a):
85
>>> double_unary_positive(2 + 2j)
90
def double_real_imaginary_accessors(complex_class[double] a, double real, double imag):
92
>>> a = double_real_imaginary_accessors(2.1 + 2j, 7, 4)
98
# checks the accessors
99
cdef double b = a.real()
102
cdef double c = a.imag()
107
def double_double_comparison_equal(complex_class[double] a, complex_class[double] b):
109
>>> double_double_comparison_equal(2.1 + 2j, 7)
111
>>> double_double_comparison_equal(2.1 + 2j, (1j + 1) * 2 + 0.1)
116
def double_scalar_double_comparison_equal(complex_class[double] a, double b):
118
>>> double_double_comparison_equal(2.1 + 2j, 7)
120
>>> double_double_comparison_equal(7 + 0j, 7)
125
def scalar_double_double_comparison_equal(complex_class[double] a, double b):
127
>>> double_double_comparison_equal(2.1 + 2j, 7)
129
>>> double_double_comparison_equal(7 + 0j, 7)
134
def double_real_imaginary_accessors_free_function(complex_class[double] a, bint real_part):
136
>>> double_real_imaginary_accessors_free_function(2.1 + 2.7j, True)
138
>>> double_real_imaginary_accessors_free_function(2.1 + 2.7j, False)
142
cdef double e = cppcomplex.real(a)
143
cdef double f = cppcomplex.imag(a)
148
def scalar_double_real_imaginary_accessors_free_function(double a, bint real_part):
150
>>> scalar_double_real_imaginary_accessors_free_function(2.1, True)
152
>>> scalar_double_real_imaginary_accessors_free_function(2.1, False)
155
cdef double e = cppcomplex.real(a)
156
cdef double f = cppcomplex.imag(a)
161
def scalar_long_double_real_imaginary_accessors_free_function(long double a, bint real_part):
163
>>> scalar_long_double_real_imaginary_accessors_free_function(2.1, True)
165
>>> scalar_long_double_real_imaginary_accessors_free_function(2.1, False)
168
cdef double e = cppcomplex.real(a)
169
cdef double f = cppcomplex.imag(a)
174
def double_abs(complex_class[double] a):
180
>>> double_abs(2 + 5j) == math.sqrt(29)
183
return cppcomplex.abs(a)
185
def double_norm(complex_class[double] a):
191
>>> abs(double_norm(2 + 5j) - double_abs(2 + 5j)*double_abs(2 + 5j)) < 1e-13
194
return cppcomplex.norm(a)
196
def scalar_double_norm(double a):
198
>>> scalar_double_norm(5)
201
return cppcomplex.norm(a)
203
def scalar_float_norm(float a):
205
>>> scalar_float_norm(5)
208
return cppcomplex.norm(a)
210
def double_conjugate(complex_class[double] a):
212
>>> double_conjugate(5)
214
>>> double_conjugate(5j)
216
>>> double_conjugate(1 + 2j)
219
return cppcomplex.conj(a)
221
def scalar_double_conjugate(double a):
223
>>> a = scalar_double_conjugate(5)
226
>>> # abs to prevent -0 or 0 issue
230
# always return complex
231
return cppcomplex.conj(a)
233
def double_proj(complex_class[double] a):
235
>>> double_proj(5 + 4j)
237
>>> double_proj(-float("infinity") + 4j)
239
>>> double_proj(5 - float("infinity")*1j)
242
return cppcomplex.proj(a)
244
def double_arg(complex_class[double] a):
249
>>> round(double_arg(math.cos(a) + math.sin(a)*1j), 10)
252
return cppcomplex.arg(a)
254
def scalar_double_arg(double a):
256
>>> scalar_double_arg(13)
258
>>> round(scalar_double_arg(-1), 10)
261
return cppcomplex.arg(a)
263
def double_polar(double r, double theta):
265
>>> c1 = double_polar(3, math.pi / 2)
268
>>> abs(c1.real) < 1e-10
270
>>> c2 = double_polar(4, math.pi)
273
>>> abs(c2.imag) < 1e-10
276
return cppcomplex.polar(r, theta)
278
def double_polar_scalar(double r):
280
>>> c1 = double_polar_scalar(3)
285
>>> c2 = double_polar_scalar(0)
291
return cppcomplex.polar(r)
293
def double_pow(complex_class[double] a, complex_class[double] b):
297
>>> a = double_pow(1j, 1j)
303
return cppcomplex.pow(a, b)
305
def double_scalar_double_pow(complex_class[double] a, double b):
309
>>> a = double_pow(1+2j, 2)
315
return cppcomplex.pow(a, b)
317
def scalar_double_double_pow(double a, complex_class[double] b):
319
>>> scalar_double_double_pow(3, 3)
321
>>> a = scalar_double_double_pow(2, 2j)
327
return cppcomplex.pow(a, b)
329
def double_sin(complex_class[double] a):
331
>>> round(abs(double_sin(math.pi)), 2)
333
>>> round(double_sin(-math.pi/4).real, 3)
335
>>> round(abs(double_sin(-math.pi/4).imag), 3)
337
>>> round(abs(double_sin(4j).real), 3)
339
>>> round(abs(double_sin(4j).imag - math.sinh(4)), 3)
342
return cppcomplex.sin(a)
344
def double_cos(complex_class[double] a):
346
>>> round(double_cos(math.pi).real, 2)
348
>>> round(abs(double_cos(math.pi).imag), 2)
350
>>> round(double_cos(-math.pi/4 + math.pi).real, 3)
352
>>> round(abs(double_cos(-math.pi/4).imag), 3)
354
>>> round(abs(double_cos(4j).imag), 3)
356
>>> round(abs(double_cos(5j).real - math.cosh(5)), 3)
359
return cppcomplex.cos(a)