%**The Haskell 98 Library Report: Rational Numbers %**~header \section{Rational Numbers} \index{rational numbers} \outline{ \inputHS{lib-hdrs/Ratio} } For each @Integral@ type $t$, there is a type @Ratio@\indextycon{Ratio} $t$ of rational pairs with components of type $t$. The type name @Rational@\indexsynonym{Rational} is a synonym for @Ratio Integer@. @Ratio@ is an instance of classes @Eq@, @Ord@, @Num@, @Real@, @Fractional@, @RealFrac@, @Enum@, @Read@, and @Show@. In each case, the instance for $@Ratio@~t$ simply ``lifts'' the corresponding operations over $t$. If $t$ is a bounded type, the results may be unpredictable; for example @Ratio Int@ may give rise to integer overflow even for rational numbers of small absolute size. The operator @(%)@\index{%@@{\tt {\char'045}}} forms the ratio of two integral numbers, reducing the fraction to terms with no common factor and such that the denominator is positive. The functions @numerator@\indextt{numerator} and @denominator@\indextt{denominator} extract the components of a ratio; these are in reduced form with a positive denominator. @Ratio@ is an abstract type. For example, @12 % 8@ is reduced to 3/2 and @12 % (-8)@ is reduced to (-3)/2. The @approxRational@ function, applied to two real fractional numbers @x@ and @epsilon@, returns the simplest rational number within the open interval "(@x@-@epsilon@, @x@+@epsilon@)". A rational number "n/d" in reduced form is said to be simpler than another "n'/d'" if "|n| \leq |n'|" and "d \leq d'". Note that it can be proved that any real interval contains a unique simplest rational. %% Deleted the following -- this is implementation detail -- KH/AD. % ; here, for simplicity, we assume a closed rational % interval. If such an interval includes at least one whole number, then % the simplest rational is the absolutely least whole number. Otherwise, % the bounds are of the form "q/1 + r/d" and "q/1 + r'/d'", where "|r| < d" % and "|r'| < d'", and the simplest rational is "q/1" + the reciprocal of % the simplest rational between "d'/r'" and "d/r". \clearpage \subsection{Library {\tt Ratio}} \label{Ratio} \inputHS{lib-code/Ratio} %**~footer