Sophie

Sophie

distrib > Fedora > 18 > x86_64 > media > updates > by-pkgid > d9ab9b712c406347034632251e926a6d > files > 68

ghc-numbers-devel-3000.2.0.0-1.fc18.x86_64.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ -->
<title>Data/Number/FixedFunctions.hs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='hs-comment'>-- Modified by Lennart Augustsson to fit into Haskell numerical hierarchy.</span>
<a name="line-2"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><span class='hs-comment'>-- Module:</span>
<a name="line-4"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><span class='hs-comment'>--      Fraction.hs</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- Language:</span>
<a name="line-8"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><span class='hs-comment'>--      Haskell</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- Description: Rational with transcendental functionalities</span>
<a name="line-12"></a><span class='hs-comment'>--</span>
<a name="line-13"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><span class='hs-comment'>--      This is a generalized Rational in disguise. Rational, as a type</span>
<a name="line-15"></a><span class='hs-comment'>--      synonim, could not be directly made an instance of any new class</span>
<a name="line-16"></a><span class='hs-comment'>--      at all.</span>
<a name="line-17"></a><span class='hs-comment'>--      But we would like it to be an instance of Transcendental, where</span>
<a name="line-18"></a><span class='hs-comment'>--      trigonometry, hyperbolics, logarithms, etc. are defined.</span>
<a name="line-19"></a><span class='hs-comment'>--      So here we are tiptoe-ing around, re-defining everything from</span>
<a name="line-20"></a><span class='hs-comment'>--      scratch, before designing the transcendental functions -- which</span>
<a name="line-21"></a><span class='hs-comment'>--      is the main motivation for this module.</span>
<a name="line-22"></a><span class='hs-comment'>--</span>
<a name="line-23"></a><span class='hs-comment'>--      Aside from its ability to compute transcendentals, Fraction</span>
<a name="line-24"></a><span class='hs-comment'>--      allows for denominators zero. Unlike Rational, Fraction does</span>
<a name="line-25"></a><span class='hs-comment'>--      not produce run-time errors for zero denominators, but use such</span>
<a name="line-26"></a><span class='hs-comment'>--      entities as indicators of invalid results -- plus or minus</span>
<a name="line-27"></a><span class='hs-comment'>--      infinities. Operations on fractions never fail in principle.</span>
<a name="line-28"></a><span class='hs-comment'>--</span>
<a name="line-29"></a><span class='hs-comment'>--      However, some function may compute slowly when both numerators</span>
<a name="line-30"></a><span class='hs-comment'>--      and denominators of their arguments are chosen to be huge.</span>
<a name="line-31"></a><span class='hs-comment'>--      For example, periodicity relations are utilized with large</span>
<a name="line-32"></a><span class='hs-comment'>--      arguments in trigonometric functions to reduce the arguments</span>
<a name="line-33"></a><span class='hs-comment'>--      to smaller values and thus improve on the convergence</span>
<a name="line-34"></a><span class='hs-comment'>--      of continued fractions. Yet, if pi number is chosen to</span>
<a name="line-35"></a><span class='hs-comment'>--      be extremely accurate then the reduced argument would</span>
<a name="line-36"></a><span class='hs-comment'>--      become a fraction with huge numerator and denominator</span>
<a name="line-37"></a><span class='hs-comment'>--      -- thus slowing down the entire computation of a trigonometric</span>
<a name="line-38"></a><span class='hs-comment'>--      function.</span>
<a name="line-39"></a><span class='hs-comment'>--</span>
<a name="line-40"></a><span class='hs-comment'>-- Usage:</span>
<a name="line-41"></a><span class='hs-comment'>--</span>
<a name="line-42"></a><span class='hs-comment'>--      When computation speed is not an issue and accuracy is important</span>
<a name="line-43"></a><span class='hs-comment'>--      this module replaces some of the functionalities typically handled</span>
<a name="line-44"></a><span class='hs-comment'>--      by the floating point numbers: trigonometry, hyperbolics, roots</span>
<a name="line-45"></a><span class='hs-comment'>--      and some special functions. All computations, including definitions</span>
<a name="line-46"></a><span class='hs-comment'>--      of the basic constants pi and e, can be carried with any desired</span>
<a name="line-47"></a><span class='hs-comment'>--      accuracy. One suggested usage is for mathematical servers, where</span>
<a name="line-48"></a><span class='hs-comment'>--      safety might be more important than speed. See also the module</span>
<a name="line-49"></a><span class='hs-comment'>--      Numerus, which supports mixed arithmetic between Integer,</span>
<a name="line-50"></a><span class='hs-comment'>--      Fraction and Cofra (Complex fraction), and returns complex</span>
<a name="line-51"></a><span class='hs-comment'>--      legal answers in some cases where Fraction would produce</span>
<a name="line-52"></a><span class='hs-comment'>--      infinities: log (-5), sqrt (-1), etc.</span>
<a name="line-53"></a><span class='hs-comment'>--</span>
<a name="line-54"></a><span class='hs-comment'>--</span>
<a name="line-55"></a><span class='hs-comment'>-- Required:</span>
<a name="line-56"></a><span class='hs-comment'>--</span>
<a name="line-57"></a><span class='hs-comment'>--      Haskell Prelude</span>
<a name="line-58"></a><span class='hs-comment'>--</span>
<a name="line-59"></a><span class='hs-comment'>-- Author:</span>
<a name="line-60"></a><span class='hs-comment'>--</span>
<a name="line-61"></a><span class='hs-comment'>--      Jan Skibinski, Numeric Quest Inc.</span>
<a name="line-62"></a><span class='hs-comment'>--</span>
<a name="line-63"></a><span class='hs-comment'>-- Date:</span>
<a name="line-64"></a><span class='hs-comment'>--</span>
<a name="line-65"></a><span class='hs-comment'>--      1998.08.16, last modified 2000.05.31</span>
<a name="line-66"></a><span class='hs-comment'>--</span>
<a name="line-67"></a><span class='hs-comment'>-- See also bottom of the page for description of the format used</span>
<a name="line-68"></a><span class='hs-comment'>-- for continued fractions, references, etc.</span>
<a name="line-69"></a><span class='hs-comment'>-------------------------------------------------------------------</span>
<a name="line-70"></a>
<a name="line-71"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Number</span><span class='hs-varop'>.</span><span class='hs-conid'>FixedFunctions</span> <span class='hs-keyword'>where</span>
<a name="line-72"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span><span class='hs-layout'>,</span> <span class='hs-varid'>sqrt</span><span class='hs-layout'>,</span> <span class='hs-varid'>tan</span><span class='hs-layout'>,</span> <span class='hs-varid'>atan</span><span class='hs-layout'>,</span> <span class='hs-varid'>exp</span><span class='hs-layout'>,</span> <span class='hs-varid'>log</span><span class='hs-layout'>)</span>
<a name="line-73"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Ratio</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="approx"></a><span class='hs-definition'>approx</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-76"></a><span class='hs-definition'>approx</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxRational</span> <span class='hs-varid'>x</span> <span class='hs-varid'>eps</span>
<a name="line-77"></a>
<a name="line-78"></a><a name="CF"></a><span class='hs-comment'>------------------------------------------------------------------</span>
<a name="line-79"></a><a name="CF"></a><span class='hs-comment'>--              Category: Conversion</span>
<a name="line-80"></a><a name="CF"></a><span class='hs-comment'>--      from continued fraction to fraction and vice versa,</span>
<a name="line-81"></a><a name="CF"></a><span class='hs-comment'>--      from Taylor series to continued fraction.</span>
<a name="line-82"></a><a name="CF"></a><span class='hs-comment'>-------------------------------------------------------------------</span>
<a name="line-83"></a><a name="CF"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>CF</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span> <span class='hs-conid'>Rational</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-84"></a>
<a name="line-85"></a><a name="fromCF"></a><span class='hs-definition'>fromCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CF</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-86"></a><span class='hs-definition'>fromCF</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-87"></a>        <span class='hs-comment'>--</span>
<a name="line-88"></a>        <span class='hs-comment'>-- Convert finite continued fraction to fraction</span>
<a name="line-89"></a>        <span class='hs-comment'>-- evaluating from right to left. This is used</span>
<a name="line-90"></a>        <span class='hs-comment'>-- mainly for testing in conjunction with "toCF".</span>
<a name="line-91"></a>        <span class='hs-comment'>--</span>
<a name="line-92"></a>        <span class='hs-varid'>foldr</span> <span class='hs-varid'>g</span> <span class='hs-num'>1</span> <span class='hs-varid'>x</span>
<a name="line-93"></a>        <span class='hs-keyword'>where</span>
<a name="line-94"></a>            <span class='hs-varid'>g</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span> <span class='hs-conid'>Rational</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-95"></a>            <span class='hs-varid'>g</span> <span class='hs-varid'>u</span> <span class='hs-varid'>v</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>fst</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>snd</span> <span class='hs-varid'>u</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-varid'>v</span>
<a name="line-96"></a>
<a name="line-97"></a><a name="toCF"></a><span class='hs-definition'>toCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CF</span>
<a name="line-98"></a><span class='hs-definition'>toCF</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-99"></a>        <span class='hs-comment'>--</span>
<a name="line-100"></a>        <span class='hs-comment'>-- Convert fraction to finite continued fraction</span>
<a name="line-101"></a>        <span class='hs-comment'>--</span>
<a name="line-102"></a>        <span class='hs-varid'>toCF'</span> <span class='hs-varid'>x</span> <span class='hs-conid'>[]</span>
<a name="line-103"></a>        <span class='hs-keyword'>where</span>
<a name="line-104"></a>            <span class='hs-varid'>toCF'</span> <span class='hs-varid'>u</span> <span class='hs-varid'>lst</span> <span class='hs-keyglyph'>=</span>
<a name="line-105"></a>                <span class='hs-keyword'>case</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>of</span>
<a name="line-106"></a>                <span class='hs-num'>0</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>reverse</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>lst</span><span class='hs-layout'>)</span>
<a name="line-107"></a>                <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>toCF'</span> <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-varop'>%</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>lst</span><span class='hs-layout'>)</span>
<a name="line-108"></a>                <span class='hs-keyword'>where</span>
<a name="line-109"></a>                    <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>numerator</span> <span class='hs-varid'>u</span>
<a name="line-110"></a>                    <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>denominator</span> <span class='hs-varid'>u</span>
<a name="line-111"></a>                    <span class='hs-layout'>(</span><span class='hs-varid'>q</span><span class='hs-layout'>,</span><span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>quotRem</span> <span class='hs-varid'>a</span> <span class='hs-varid'>b</span>
<a name="line-112"></a>
<a name="line-113"></a>
<a name="line-114"></a><a name="approxCF"></a><span class='hs-definition'>approxCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CF</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-115"></a><span class='hs-definition'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-116"></a><span class='hs-definition'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-117"></a>        <span class='hs-comment'>--</span>
<a name="line-118"></a>        <span class='hs-comment'>-- Approximate infinite continued fraction x by fraction,</span>
<a name="line-119"></a>        <span class='hs-comment'>-- evaluating from left to right, and stopping when</span>
<a name="line-120"></a>        <span class='hs-comment'>-- accuracy eps is achieved, or when a partial numerator</span>
<a name="line-121"></a>        <span class='hs-comment'>-- is zero -- as it indicates the end of CF.</span>
<a name="line-122"></a>        <span class='hs-comment'>--</span>
<a name="line-123"></a>        <span class='hs-comment'>-- This recursive function relates continued fraction</span>
<a name="line-124"></a>        <span class='hs-comment'>-- to rational approximation.</span>
<a name="line-125"></a>        <span class='hs-comment'>--</span>
<a name="line-126"></a>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF'</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-num'>0</span> <span class='hs-num'>1</span> <span class='hs-num'>1</span> <span class='hs-varid'>q'</span> <span class='hs-varid'>p'</span> <span class='hs-num'>1</span>
<a name="line-127"></a>            <span class='hs-keyword'>where</span>
<a name="line-128"></a>                <span class='hs-varid'>h</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fst</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>!!</span><span class='hs-num'>0</span><span class='hs-layout'>)</span>
<a name="line-129"></a>                <span class='hs-layout'>(</span><span class='hs-varid'>q'</span><span class='hs-layout'>,</span> <span class='hs-varid'>p'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span><span class='hs-varop'>!!</span><span class='hs-num'>0</span>
<a name="line-130"></a>                <span class='hs-varid'>approxCF'</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-varid'>v2</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>u2</span> <span class='hs-varid'>u1</span> <span class='hs-varid'>a'</span> <span class='hs-varid'>n</span>
<a name="line-131"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>abs</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>f1</span><span class='hs-varop'>/</span><span class='hs-varid'>f</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approx</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>f</span>
<a name="line-132"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>a</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approx</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>f</span>
<a name="line-133"></a>                    <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF'</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-varid'>v1</span> <span class='hs-varid'>v</span> <span class='hs-varid'>u1</span> <span class='hs-varid'>u</span> <span class='hs-varid'>a</span> <span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-134"></a>                    <span class='hs-keyword'>where</span>
<a name="line-135"></a>                        <span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>x</span><span class='hs-varop'>!!</span><span class='hs-varid'>n</span>
<a name="line-136"></a>                        <span class='hs-varid'>u</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span><span class='hs-varop'>*</span><span class='hs-varid'>u1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>a'</span><span class='hs-varop'>*</span><span class='hs-varid'>u2</span>
<a name="line-137"></a>                        <span class='hs-varid'>v</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>b</span><span class='hs-varop'>*</span><span class='hs-varid'>v1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>a'</span><span class='hs-varop'>*</span><span class='hs-varid'>v2</span>
<a name="line-138"></a>                        <span class='hs-varid'>f</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>u</span><span class='hs-varop'>/</span><span class='hs-varid'>v</span>
<a name="line-139"></a>                        <span class='hs-varid'>f1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>u1</span><span class='hs-varop'>/</span><span class='hs-varid'>v1</span>
<a name="line-140"></a>
<a name="line-141"></a>
<a name="line-142"></a><a name="fromTaylorToCF"></a><span class='hs-comment'>-- Type signature determined by GHC.</span>
<a name="line-143"></a><span class='hs-definition'>fromTaylorToCF</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fractional</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-144"></a><span class='hs-definition'>fromTaylorToCF</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-145"></a>        <span class='hs-comment'>--</span>
<a name="line-146"></a>        <span class='hs-comment'>-- Convert infinite number of terms of Taylor expansion of</span>
<a name="line-147"></a>        <span class='hs-comment'>-- a function f(x) to an infinite continued fraction,</span>
<a name="line-148"></a>        <span class='hs-comment'>-- where s = [s0,s1,s2,s3....] is a list of Taylor</span>
<a name="line-149"></a>        <span class='hs-comment'>-- series coefficients, such that f(x)=s0 + s1*x + s2*x^2....</span>
<a name="line-150"></a>        <span class='hs-comment'>--</span>
<a name="line-151"></a>        <span class='hs-comment'>-- Require: No Taylor coefficient is zero</span>
<a name="line-152"></a>        <span class='hs-comment'>--</span>
<a name="line-153"></a>        <span class='hs-varid'>zero</span><span class='hs-conop'>:</span><span class='hs-varid'>one</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>higher</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>2</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-154"></a>        <span class='hs-keyword'>where</span>
<a name="line-155"></a>            <span class='hs-varid'>zero</span>      <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>0</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>1</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-156"></a>            <span class='hs-varid'>one</span>       <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span> <span class='hs-comment'>-</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>2</span><span class='hs-varop'>/</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-num'>1</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-157"></a>            <span class='hs-varid'>higher</span> <span class='hs-varid'>m</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-varid'>m</span><span class='hs-varop'>/</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-comment'>-</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-varid'>s</span><span class='hs-varop'>!!</span><span class='hs-varid'>m</span> <span class='hs-varop'>*</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-158"></a>
<a name="line-159"></a>
<a name="line-160"></a><span class='hs-comment'>------------------------------------------------------------------</span>
<a name="line-161"></a><span class='hs-comment'>--                Category: Auxiliaries</span>
<a name="line-162"></a><span class='hs-comment'>------------------------------------------------------------------</span>
<a name="line-163"></a>
<a name="line-164"></a><a name="fac"></a><span class='hs-definition'>fac</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span>
<a name="line-165"></a><span class='hs-definition'>fac</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>product</span> <span class='hs-varop'>.</span> <span class='hs-varid'>enumFromTo</span> <span class='hs-num'>1</span>
<a name="line-166"></a>
<a name="line-167"></a><a name="integerRoot2"></a><span class='hs-definition'>integerRoot2</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Integer</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Integer</span>
<a name="line-168"></a><span class='hs-definition'>integerRoot2</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
<a name="line-169"></a><span class='hs-definition'>integerRoot2</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-170"></a>        <span class='hs-comment'>--</span>
<a name="line-171"></a>        <span class='hs-comment'>-- Biggest integer m, such that x - m^2 &gt;= 0,</span>
<a name="line-172"></a>        <span class='hs-comment'>-- where x is a positive integer</span>
<a name="line-173"></a>        <span class='hs-comment'>--</span>
<a name="line-174"></a>        <span class='hs-varid'>integerRoot2'</span> <span class='hs-num'>0</span> <span class='hs-varid'>x</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>x</span>
<a name="line-175"></a>        <span class='hs-keyword'>where</span>
<a name="line-176"></a>            <span class='hs-varid'>integerRoot2'</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>hi</span> <span class='hs-varid'>r</span> <span class='hs-varid'>y</span>
<a name="line-177"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>y</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>integerRoot2'</span> <span class='hs-varid'>lo</span> <span class='hs-varid'>r</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-varid'>lo</span><span class='hs-layout'>)</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span>
<a name="line-178"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>c</span> <span class='hs-varop'>==</span> <span class='hs-varid'>y</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span>
<a name="line-179"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span>
<a name="line-180"></a>                    <span class='hs-keyword'>if</span> <span class='hs-layout'>(</span><span class='hs-varid'>r</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-num'>2</span> <span class='hs-varop'>&gt;</span> <span class='hs-varid'>y</span> <span class='hs-keyword'>then</span>
<a name="line-181"></a>                        <span class='hs-varid'>r</span>
<a name="line-182"></a>                    <span class='hs-keyword'>else</span>
<a name="line-183"></a>                        <span class='hs-varid'>integerRoot2'</span> <span class='hs-varid'>r</span> <span class='hs-varid'>hi</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-varid'>hi</span><span class='hs-layout'>)</span> <span class='hs-varop'>`div`</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varid'>y</span>
<a name="line-184"></a>                    <span class='hs-keyword'>where</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>r</span><span class='hs-varop'>^</span><span class='hs-num'>2</span>
<a name="line-185"></a>
<a name="line-186"></a><span class='hs-comment'>-------------------------------------------------------------------</span>
<a name="line-187"></a><span class='hs-comment'>-- Everything below is the instantiation of class Transcendental</span>
<a name="line-188"></a><span class='hs-comment'>-- for type Rational. See also modules Cofra and Numerus.</span>
<a name="line-189"></a><span class='hs-comment'>--</span>
<a name="line-190"></a><span class='hs-comment'>--                Category: Constants</span>
<a name="line-191"></a><span class='hs-comment'>-------------------------------------------------------------------</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="pi"></a><span class='hs-definition'>pi</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-194"></a><span class='hs-definition'>pi</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>=</span>
<a name="line-195"></a>        <span class='hs-comment'>--</span>
<a name="line-196"></a>        <span class='hs-comment'>-- pi with accuracy eps</span>
<a name="line-197"></a>        <span class='hs-comment'>--</span>
<a name="line-198"></a>        <span class='hs-comment'>-- Based on Ramanujan formula, as described in Ref. 3</span>
<a name="line-199"></a>        <span class='hs-comment'>-- Accuracy: extremely good, 10^-19 for one term of continued</span>
<a name="line-200"></a>        <span class='hs-comment'>-- fraction</span>
<a name="line-201"></a>        <span class='hs-comment'>--</span>
<a name="line-202"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>fromTaylorToCF</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-203"></a>        <span class='hs-keyword'>where</span>
<a name="line-204"></a>            <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-layout'>(</span><span class='hs-num'>640320</span><span class='hs-varop'>^</span><span class='hs-num'>3</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>::</span><span class='hs-conid'>Rational</span>
<a name="line-205"></a>            <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-varid'>k</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-varid'>fac</span> <span class='hs-layout'>(</span><span class='hs-num'>6</span><span class='hs-varop'>*</span><span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>fac</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-num'>3</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-varid'>fac</span> <span class='hs-layout'>(</span><span class='hs-num'>3</span><span class='hs-varop'>*</span><span class='hs-varid'>k</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-varop'>*</span><span class='hs-varid'>k</span><span class='hs-varop'>+</span><span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>k</span><span class='hs-keyglyph'>&lt;-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-206"></a>            <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>545140134</span>
<a name="line-207"></a>            <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>13591409</span>
<a name="line-208"></a>            <span class='hs-varid'>c</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>426880</span>
<a name="line-209"></a>            <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>10005</span>
<a name="line-210"></a>
<a name="line-211"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-212"></a><span class='hs-comment'>--                Category: Trigonometry</span>
<a name="line-213"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-214"></a>
<a name="line-215"></a><a name="tan"></a><span class='hs-definition'>tan</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-216"></a><span class='hs-definition'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-num'>0</span>  <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-217"></a><span class='hs-definition'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-218"></a>        <span class='hs-comment'>--</span>
<a name="line-219"></a>        <span class='hs-comment'>-- Tangent x computed with accuracy of eps.</span>
<a name="line-220"></a>        <span class='hs-comment'>--</span>
<a name="line-221"></a>        <span class='hs-comment'>-- Trigonometric identities are used first to reduce</span>
<a name="line-222"></a>        <span class='hs-comment'>-- the value of x to a value from within the range of [-pi/2,pi/2]</span>
<a name="line-223"></a>        <span class='hs-comment'>--</span>
<a name="line-224"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;=</span> <span class='hs-varid'>half_pi'</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-comment'>-</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>+</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-varid'>xpi</span><span class='hs-layout'>)</span>
<a name="line-225"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-comment'>-</span><span class='hs-varid'>half_pi'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>+</span><span class='hs-varid'>m</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-varid'>xpi</span><span class='hs-layout'>)</span>
<a name="line-226"></a>        <span class='hs-comment'>--- | absx &gt; 1       = 2 * t/(1 - t^2)</span>
<a name="line-227"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>cf</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-228"></a>        <span class='hs-keyword'>where</span>
<a name="line-229"></a>            <span class='hs-varid'>absx</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>abs</span> <span class='hs-varid'>x</span>
<a name="line-230"></a>            <span class='hs-varid'>t</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-231"></a>            <span class='hs-varid'>m</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>floor</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>absx</span> <span class='hs-comment'>-</span> <span class='hs-varid'>half_pi</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span> <span class='hs-varid'>xpi</span><span class='hs-layout'>)</span>
<a name="line-232"></a>            <span class='hs-varid'>xpi</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span>
<a name="line-233"></a>            <span class='hs-varid'>half_pi'</span><span class='hs-keyglyph'>=</span> <span class='hs-num'>158</span><span class='hs-varop'>%</span><span class='hs-num'>100</span>
<a name="line-234"></a>            <span class='hs-varid'>half_pi</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>xpi</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-235"></a>            <span class='hs-varid'>cf</span> <span class='hs-varid'>u</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>r</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-varid'>u</span><span class='hs-layout'>,</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-236"></a>
<a name="line-237"></a><a name="sin"></a><span class='hs-definition'>sin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-238"></a><span class='hs-definition'>sin</span> <span class='hs-varid'>eps</span> <span class='hs-num'>0</span>      <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-239"></a><span class='hs-definition'>sin</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>      <span class='hs-keyglyph'>=</span> <span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>t</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>t</span><span class='hs-varop'>*</span><span class='hs-varid'>t</span><span class='hs-layout'>)</span>
<a name="line-240"></a>        <span class='hs-keyword'>where</span>
<a name="line-241"></a>            <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-242"></a>
<a name="line-243"></a><a name="cos"></a><span class='hs-definition'>cos</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-244"></a><span class='hs-definition'>cos</span> <span class='hs-varid'>eps</span> <span class='hs-num'>0</span>      <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
<a name="line-245"></a><span class='hs-definition'>cos</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>      <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>p</span><span class='hs-layout'>)</span>
<a name="line-246"></a>        <span class='hs-keyword'>where</span>
<a name="line-247"></a>            <span class='hs-varid'>t</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-248"></a>            <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>t</span><span class='hs-varop'>*</span><span class='hs-varid'>t</span>
<a name="line-249"></a>
<a name="line-250"></a><a name="atan"></a><span class='hs-definition'>atan</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-251"></a><span class='hs-definition'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-252"></a>        <span class='hs-comment'>--</span>
<a name="line-253"></a>        <span class='hs-comment'>-- Inverse tangent of x with approximation eps</span>
<a name="line-254"></a>        <span class='hs-comment'>--</span>
<a name="line-255"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>       <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-256"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span>        <span class='hs-keyglyph'>=</span>  <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-num'>2</span> <span class='hs-comment'>-</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-257"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span>       <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span><span class='hs-num'>2</span> <span class='hs-comment'>-</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-258"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>m</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>*</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>m</span><span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-259"></a>
<a name="line-260"></a>
<a name="line-261"></a><a name="asin"></a><span class='hs-definition'>asin</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-262"></a><span class='hs-definition'>asin</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-263"></a>        <span class='hs-comment'>--</span>
<a name="line-264"></a>        <span class='hs-comment'>-- Inverse sine of x with approximation eps</span>
<a name="line-265"></a>        <span class='hs-comment'>--</span>
<a name="line-266"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-267"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>abs</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.asin"</span>
<a name="line-268"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span>  <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-269"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span>   <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-270"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-271"></a>
<a name="line-272"></a>
<a name="line-273"></a><a name="acos"></a><span class='hs-definition'>acos</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-274"></a><span class='hs-definition'>acos</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-275"></a>        <span class='hs-comment'>--</span>
<a name="line-276"></a>        <span class='hs-comment'>-- Inverse cosine of x with approximation eps</span>
<a name="line-277"></a>        <span class='hs-comment'>--</span>
<a name="line-278"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-279"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>abs</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.sin"</span>
<a name="line-280"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span>    <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-281"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-comment'>-</span><span class='hs-num'>1</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pi</span> <span class='hs-varid'>eps</span>
<a name="line-282"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>atan</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-283"></a>
<a name="line-284"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-285"></a><span class='hs-comment'>--                Category: Roots</span>
<a name="line-286"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-287"></a>
<a name="line-288"></a><a name="sqrt"></a><span class='hs-definition'>sqrt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-289"></a><span class='hs-definition'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-290"></a>        <span class='hs-comment'>--</span>
<a name="line-291"></a>        <span class='hs-comment'>-- Square root of x with approximation eps</span>
<a name="line-292"></a>        <span class='hs-comment'>--</span>
<a name="line-293"></a>        <span class='hs-comment'>-- The CF pattern is: [(m,x-m^2),(2m,x-m^2),(2m,x-m^2)....]</span>
<a name="line-294"></a>        <span class='hs-comment'>-- where m is the biggest integer such that x-m^2 &gt;= 0</span>
<a name="line-295"></a>        <span class='hs-comment'>--</span>
<a name="line-296"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>0</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.sqrt"</span>
<a name="line-297"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>       <span class='hs-keyglyph'>=</span> <span class='hs-num'>0</span>
<a name="line-298"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>1</span>        <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-299"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-comment'>-</span><span class='hs-varid'>m</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-num'>2</span><span class='hs-varop'>*</span><span class='hs-varid'>m</span><span class='hs-layout'>,</span><span class='hs-varid'>x</span><span class='hs-comment'>-</span><span class='hs-varid'>m</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>r</span><span class='hs-keyglyph'>&lt;-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-300"></a>        <span class='hs-keyword'>where</span>
<a name="line-301"></a>            <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>integerRoot2</span> <span class='hs-layout'>(</span><span class='hs-varid'>floor</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-num'>1</span>
<a name="line-302"></a>
<a name="line-303"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-304"></a><span class='hs-comment'>--              Category: Exponentials and hyperbolics</span>
<a name="line-305"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-306"></a>
<a name="line-307"></a><a name="exp"></a><span class='hs-definition'>exp</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-308"></a><span class='hs-definition'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-309"></a>        <span class='hs-comment'>--</span>
<a name="line-310"></a>        <span class='hs-comment'>-- Exponent of x with approximation eps</span>
<a name="line-311"></a>        <span class='hs-comment'>--</span>
<a name="line-312"></a>        <span class='hs-comment'>-- Based on Jacobi type continued fraction for exponential,</span>
<a name="line-313"></a>        <span class='hs-comment'>-- with fractional terms:</span>
<a name="line-314"></a>        <span class='hs-comment'>--     n == 0 ==&gt; (1,x)</span>
<a name="line-315"></a>        <span class='hs-comment'>--     n == 1 ==&gt; (1 -x/2, x^2/12)</span>
<a name="line-316"></a>        <span class='hs-comment'>--     n &gt;= 2 ==&gt; (1, x^2/(16*n^2 - 4))</span>
<a name="line-317"></a>        <span class='hs-comment'>-- For x outside [-1,1] apply identity exp(x) = (exp(x/2))^2</span>
<a name="line-318"></a>        <span class='hs-comment'>--</span>
<a name="line-319"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>0</span>       <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span>
<a name="line-320"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&gt;</span> <span class='hs-num'>1</span>        <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-varid'>p</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-varid'>p</span>
<a name="line-321"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span> <span class='hs-layout'>(</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-varid'>q</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-varop'>^</span><span class='hs-varid'>q</span>
<a name="line-322"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-323"></a>        <span class='hs-keyword'>where</span>
<a name="line-324"></a>            <span class='hs-varid'>p</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ceiling</span> <span class='hs-varid'>x</span>
<a name="line-325"></a>            <span class='hs-varid'>q</span> <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-layout'>(</span><span class='hs-varid'>floor</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-326"></a>            <span class='hs-varid'>f</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-comment'>-</span><span class='hs-varid'>y</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-varop'>/</span><span class='hs-num'>12</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>y</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-varop'>/</span><span class='hs-layout'>(</span><span class='hs-num'>16</span><span class='hs-varop'>*</span><span class='hs-varid'>n</span><span class='hs-varop'>^</span><span class='hs-num'>2</span><span class='hs-comment'>-</span><span class='hs-num'>4</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span><span class='hs-keyglyph'>&lt;-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>2</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-327"></a>
<a name="line-328"></a>
<a name="line-329"></a><a name="cosh"></a><span class='hs-definition'>cosh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-330"></a><span class='hs-definition'>cosh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-331"></a>        <span class='hs-comment'>--</span>
<a name="line-332"></a>        <span class='hs-comment'>-- Hyperbolic cosine with approximation eps</span>
<a name="line-333"></a>        <span class='hs-comment'>--</span>
<a name="line-334"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>+</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-335"></a>        <span class='hs-keyword'>where</span>
<a name="line-336"></a>            <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-337"></a>            <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>a</span>
<a name="line-338"></a>
<a name="line-339"></a><a name="sinh"></a><span class='hs-definition'>sinh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-340"></a><span class='hs-definition'>sinh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-341"></a>        <span class='hs-comment'>--</span>
<a name="line-342"></a>        <span class='hs-comment'>-- Hyperbolic sine with approximation eps</span>
<a name="line-343"></a>        <span class='hs-comment'>--</span>
<a name="line-344"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-comment'>-</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span>
<a name="line-345"></a>        <span class='hs-keyword'>where</span>
<a name="line-346"></a>            <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-347"></a>            <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>a</span>
<a name="line-348"></a>
<a name="line-349"></a><a name="tanh"></a><span class='hs-definition'>tanh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-350"></a><span class='hs-definition'>tanh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span>
<a name="line-351"></a>        <span class='hs-comment'>--</span>
<a name="line-352"></a>        <span class='hs-comment'>-- Hyperbolic tangent with approximation eps</span>
<a name="line-353"></a>        <span class='hs-comment'>--</span>
<a name="line-354"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-comment'>-</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span><span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-varop'>+</span> <span class='hs-varid'>b</span><span class='hs-layout'>)</span>
<a name="line-355"></a>        <span class='hs-keyword'>where</span>
<a name="line-356"></a>            <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-357"></a>            <span class='hs-varid'>b</span> <span class='hs-keyglyph'>=</span> <span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>a</span>
<a name="line-358"></a>
<a name="line-359"></a><a name="atanh"></a><span class='hs-definition'>atanh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-360"></a><span class='hs-definition'>atanh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-361"></a>        <span class='hs-comment'>--</span>
<a name="line-362"></a>        <span class='hs-comment'>-- Inverse hyperbolic tangent with approximation eps</span>
<a name="line-363"></a>        <span class='hs-comment'>--</span>
<a name="line-364"></a>
<a name="line-365"></a><span class='hs-comment'>--      | x &gt;= 1     = 1%0</span>
<a name="line-366"></a><span class='hs-comment'>--      | x &lt;= -1    = -1%0</span>
<a name="line-367"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-layout'>(</span><span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-varop'>+</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varop'>/</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span> <span class='hs-comment'>-</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-368"></a>
<a name="line-369"></a><a name="asinh"></a><span class='hs-definition'>asinh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-370"></a><span class='hs-definition'>asinh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-371"></a>        <span class='hs-comment'>--</span>
<a name="line-372"></a>        <span class='hs-comment'>-- Inverse hyperbolic sine</span>
<a name="line-373"></a>        <span class='hs-comment'>--</span>
<a name="line-374"></a><span class='hs-comment'>--      | x == 1%0  =  1%0</span>
<a name="line-375"></a><span class='hs-comment'>--      | x == -1%0 = -1%0</span>
<a name="line-376"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-377"></a>
<a name="line-378"></a><a name="acosh"></a><span class='hs-definition'>acosh</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-379"></a><span class='hs-definition'>acosh</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-380"></a>        <span class='hs-comment'>--</span>
<a name="line-381"></a>        <span class='hs-comment'>-- Inverse hyperbolic cosine</span>
<a name="line-382"></a>        <span class='hs-comment'>--</span>
<a name="line-383"></a><span class='hs-comment'>--      | x == 1%0 = 1%0</span>
<a name="line-384"></a><span class='hs-comment'>--      | x &lt; 1     = 1%0</span>
<a name="line-385"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>sqrt</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>^</span><span class='hs-num'>2</span> <span class='hs-comment'>-</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-386"></a>
<a name="line-387"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-388"></a><span class='hs-comment'>--                Category: Logarithms</span>
<a name="line-389"></a><span class='hs-comment'>---------------------------------------------------------------------</span>
<a name="line-390"></a>
<a name="line-391"></a><a name="log"></a><span class='hs-definition'>log</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Rational</span>
<a name="line-392"></a><span class='hs-definition'>log</span> <span class='hs-varid'>eps</span> <span class='hs-varid'>x</span>
<a name="line-393"></a>        <span class='hs-comment'>--</span>
<a name="line-394"></a>        <span class='hs-comment'>-- Natural logarithm of strictly positive x</span>
<a name="line-395"></a>        <span class='hs-comment'>--</span>
<a name="line-396"></a>        <span class='hs-comment'>-- Based on Stieltjes type continued fraction for log (1+y)</span>
<a name="line-397"></a>        <span class='hs-comment'>--     (0,y):(1,y/2):[(1,my/(4m+2)),(1,(m+1)y/(4m+2)),....</span>
<a name="line-398"></a>        <span class='hs-comment'>--     (m &gt;= 1, two elements per m)</span>
<a name="line-399"></a>        <span class='hs-comment'>-- Efficient only for x close to one. For larger x we recursively</span>
<a name="line-400"></a>        <span class='hs-comment'>-- apply the identity log(x) = log(x/2) + log(2)</span>
<a name="line-401"></a>        <span class='hs-comment'>--</span>
<a name="line-402"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;=</span> <span class='hs-num'>0</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"Fraction.log"</span>
<a name="line-403"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span>  <span class='hs-num'>1</span>    <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-</span><span class='hs-varid'>log</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>/</span><span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-404"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>1</span>    <span class='hs-keyglyph'>=</span>  <span class='hs-num'>0</span>
<a name="line-405"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span>
<a name="line-406"></a>            <span class='hs-keyword'>case</span> <span class='hs-layout'>(</span><span class='hs-varid'>scaled</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span><span class='hs-num'>0</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>of</span>
<a name="line-407"></a>            <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varop'>*</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-408"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span><span class='hs-num'>0</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-409"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span><span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>+</span> <span class='hs-layout'>(</span><span class='hs-varid'>s</span><span class='hs-varop'>%</span><span class='hs-num'>1</span><span class='hs-layout'>)</span><span class='hs-varop'>*</span><span class='hs-varid'>approxCF</span> <span class='hs-varid'>eps</span> <span class='hs-layout'>(</span><span class='hs-varid'>series</span> <span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-410"></a>        <span class='hs-keyword'>where</span>
<a name="line-411"></a>            <span class='hs-varid'>series</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Rational</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CF</span>
<a name="line-412"></a>            <span class='hs-varid'>series</span> <span class='hs-varid'>u</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-varop'>/</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>u</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>m</span><span class='hs-varop'>+</span><span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-varop'>%</span><span class='hs-layout'>(</span><span class='hs-num'>4</span><span class='hs-varop'>*</span><span class='hs-varid'>m</span> <span class='hs-varop'>+</span> <span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>|</span><span class='hs-varid'>m</span><span class='hs-keyglyph'>&lt;-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>1</span><span class='hs-keyglyph'>..</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-keyglyph'>&lt;-</span><span class='hs-keyglyph'>[</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-num'>1</span><span class='hs-keyglyph'>]</span><span class='hs-keyglyph'>]</span>
<a name="line-413"></a>            <span class='hs-varid'>scaled</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span><span class='hs-conid'>Integer</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>Rational</span><span class='hs-layout'>,</span> <span class='hs-conid'>Integer</span><span class='hs-layout'>)</span>
<a name="line-414"></a>            <span class='hs-varid'>scaled</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-415"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>==</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-layout'>,</span><span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-416"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>x</span> <span class='hs-varop'>&lt;</span> <span class='hs-num'>2</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-417"></a>                <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>scaled</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-varop'>*</span><span class='hs-layout'>(</span><span class='hs-num'>1</span><span class='hs-varop'>%</span><span class='hs-num'>2</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>n</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span>
<a name="line-418"></a>
<a name="line-419"></a>
<a name="line-420"></a><span class='hs-comment'>---------------------------------------------------------------------------</span>
<a name="line-421"></a><span class='hs-comment'>-- References:</span>
<a name="line-422"></a><span class='hs-comment'>--</span>
<a name="line-423"></a><span class='hs-comment'>-- 1. Classical Gosper notes on continued fraction arithmetic:</span>
<a name="line-424"></a><span class='hs-comment'>--      http:%www.inwap.com/pdp10/hbaker/hakmem/cf.html</span>
<a name="line-425"></a><span class='hs-comment'>-- 2. Pages on numerical constants represented as continued fractions:</span>
<a name="line-426"></a><span class='hs-comment'>--      http:%www.mathsoft.com/asolve/constant/cntfrc/cntfrc.html</span>
<a name="line-427"></a><span class='hs-comment'>-- 3. "Efficient on-line computation of real functions using exact floating</span>
<a name="line-428"></a><span class='hs-comment'>--     point", by Peter John Potts, Imperial College</span>
<a name="line-429"></a><span class='hs-comment'>--      http:%theory.doc.ic.ac.uk/~pjp/ieee.html</span>
<a name="line-430"></a><span class='hs-comment'>--------------------------------------------------------------------------</span>
<a name="line-431"></a>
<a name="line-432"></a><span class='hs-comment'>--------------------------------------------------------------------------</span>
<a name="line-433"></a>
<a name="line-434"></a><span class='hs-comment'>--      The following representation of continued fractions is used:</span>
<a name="line-435"></a><span class='hs-comment'>--</span>
<a name="line-436"></a><span class='hs-comment'>--      Continued fraction:         CF representation:</span>
<a name="line-437"></a><span class='hs-comment'>--      ==================           ====================</span>
<a name="line-438"></a><span class='hs-comment'>--      b0 + a0</span>
<a name="line-439"></a><span class='hs-comment'>--           -------        ==&gt;      [(b0, a0), (b1, a1), (b2, a2).....]</span>
<a name="line-440"></a><span class='hs-comment'>--           b1 + a1</span>
<a name="line-441"></a><span class='hs-comment'>--                -------</span>
<a name="line-442"></a><span class='hs-comment'>--                b2 + ...</span>
<a name="line-443"></a><span class='hs-comment'>--</span>
<a name="line-444"></a><span class='hs-comment'>--      where "a's" and "b's" are Rationals.</span>
<a name="line-445"></a><span class='hs-comment'>--</span>
<a name="line-446"></a><span class='hs-comment'>--      Many continued fractions could be represented by much simpler form</span>
<a name="line-447"></a><span class='hs-comment'>--      [b1,b2,b3,b4..], where all coefficients "a" would have the same value 1</span>
<a name="line-448"></a><span class='hs-comment'>--      and would not need to be explicitely listed; and the coefficients "b"</span>
<a name="line-449"></a><span class='hs-comment'>--      could be chosen as integers.</span>
<a name="line-450"></a><span class='hs-comment'>--      However, there are some useful continued fractions that are</span>
<a name="line-451"></a><span class='hs-comment'>--      given with fraction coefficients: "a", "b" or both.</span>
<a name="line-452"></a><span class='hs-comment'>--      A fractional form can always be converted to an integer form, but</span>
<a name="line-453"></a><span class='hs-comment'>--      a conversion process is not always simple and such an effort is not</span>
<a name="line-454"></a><span class='hs-comment'>--      always worth of the achieved savings in the storage space or the</span>
<a name="line-455"></a><span class='hs-comment'>--      computational efficiency.</span>
<a name="line-456"></a><span class='hs-comment'>--</span>
<a name="line-457"></a><span class='hs-comment'>----------------------------------------------------------------------------</span>
<a name="line-458"></a><span class='hs-comment'>--</span>
<a name="line-459"></a><span class='hs-comment'>-- Copyright:</span>
<a name="line-460"></a><span class='hs-comment'>--</span>
<a name="line-461"></a><span class='hs-comment'>--      (C) 1998 Numeric Quest, All rights reserved</span>
<a name="line-462"></a><span class='hs-comment'>--</span>
<a name="line-463"></a><span class='hs-comment'>--      &lt;jans@numeric-quest.com&gt;</span>
<a name="line-464"></a><span class='hs-comment'>--</span>
<a name="line-465"></a><span class='hs-comment'>--      <a href="http://www.numeric-quest.com">http://www.numeric-quest.com</a></span>
<a name="line-466"></a><span class='hs-comment'>--</span>
<a name="line-467"></a><span class='hs-comment'>-- License:</span>
<a name="line-468"></a><span class='hs-comment'>--</span>
<a name="line-469"></a><span class='hs-comment'>--      GNU General Public License, GPL</span>
<a name="line-470"></a><span class='hs-comment'>--</span>
<a name="line-471"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span>
</pre></body>
</html>