def sin(x, err=defaultError): """ sin(x [,err]) returns the sine of x. """ if not isinstance(err, defaultError.__class__) or err <= defaultError: rx = rational.Rational(x) sign = rational.Rational(1) # sin(-x) = -sin(x) if rx < 0: sign = -sign rx = -rx # sin(x + 2 * pi) = sin(x) if rx >= 2 * pi: rx -= floor(rx / (pi * 2)) * (pi * 2) # sin(x + pi) = -sin(x) if rx >= pi: rx -= pi sign = -sign # sin(x) = sin(pi - x) if rx > pi / 2: rx = pi - rx # sin(0) = 0 is a special case which must not be computed with series. if rx == 0: return rational.Rational(0) # sin(x) = cos(pi/2 - x) (pi/2 >= x > 4/pi) if rx > pi / 4: if rx == pi / 3: retval = sqrt(3) / 2 else: retval = _cosTaylor(pi / 2 - rx, err) elif rx == pi / 4: retval = 1 / sqrt(2) elif rx == pi / 6: retval = rational.Rational(1, 2) else: retval = _sinTaylor(rx, err) if retval > 1: retval = rational.Integer(1) retval *= sign else: retval = rational.Rational(math.sin(x)) return retval