def atan(x, err=defaultError): """ atan(x [,err]) returns arc tangent of x. """ if not isinstance(err, defaultError.__class__) or err <= defaultError: # atan(x) = -atan(-x) if x < 0: return -atan(-x, err) # atan(x) = pi/2 - atan(1/x) elif x > 1: return pi(err) / 2 - atan(1 / x, err) elif x == 1: return pi(err) / 4 elif x == 0: return rational.Integer(0) y = rational.Rational(x) y2 = y**2 retval = y oldvalue = 0 term = rational.Rational(x) i = 1 while not err.nearlyEqual(retval, oldvalue): oldvalue = +retval i += 2 term *= -y2 * (i - 2) / i retval += term else: retval = rational.Rational(math.atan(x)) return retval