def asin(x, err=defaultError): """ asin(x [,err]) returns arc sine of x. """ if x > 1 or x < -1: raise ValueError("%s is not in the range [-1, 1]." % str(x)) if x < 0: return -asin(-x) if err <= defaultError: u = sqrt(rational.Rational(1, 2)) if x > u: return pi(err) / 2 - asin(sqrt(1 - x**2)) if x == 0: return rational.Integer(0) y = rational.Rational(x) y2 = y**2 i = 2 retval = y term = rational.Rational(y) oldvalue = 0 while not err.nearlyEqual(retval, oldvalue): oldvalue = +retval term *= y2 * (i - 1)**2 / (i * (i + 1)) i += 2 retval += term else: retval = rational.Rational(math.asin(x)) return retval