bug in modulus?

Gerard Flanagan grflanagan at yahoo.co.uk
Mon Apr 24 04:08:46 EDT 2006


jantod at gmail.com wrote:
> But maybe I'm reading it wrong. In any case what I wanted was simply a
> way to extract the angle from a complex number where the angle is
> between 0 and 2*pi. I think I'll just take the modulus twice.
>
> def angle(complex):
> 	"""Returns angle where 2*pi > angle >=0
>
> 		>>> angle(1+1j) - atan(1) < 1e-3
> 		True
> 		>>> angle(-1+1j) - (atan(-1) + 3*pi) % (2*pi) < 1e-3
> 		True
> 		>>> angle(0+1j) == pi/2
> 		True
> 		>>> angle(0-1j) == 1.5*pi
> 		True
> 		>>> angle(1+0j) == 0
> 		True
> 		>>> angle(0+0j) == 0
> 		True
> 		>>> angle(1-1e-100*1j) == 0
> 		True
> 	"""
> 	if complex.real == 0:
> 		if complex.imag == 0:
> 			return 0
> 		if complex.imag < 0:
> 			return 1.5*pi
> 		return pi/2
> 	theta = (atan2(complex.imag, complex.real) % (2*pi)) % (2*pi)
> 	assert 2*pi > theta >=0, (theta, complex)
> 	return theta
>


from math import atan2, pi

def cangle(z):
    ret = atan2(z.imag, z.real)
    if ret < 0:
        ret += 2*pi
    return ret

assert cangle(1+1j) * 180 / pi == 45.0
assert cangle(-1+1j) * 180 / pi == 135.0
assert cangle(-1-1j) * 180 / pi == 225.0
assert cangle(1-1j) * 180 / pi == 315.0
assert cangle(1+0j) * 180 / pi == 0.0
assert cangle(-1+0j) * 180 / pi == 180.0
assert cangle(1j) * 180 / pi == 90.0
assert cangle(-1j) * 180 / pi == 270.0

Gerard




More information about the Python-list mailing list