Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/libcfa/rational.c

    rf621a148 r6e4b913  
    1010// Created On       : Wed Apr  6 17:54:28 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Apr 27 17:05:06 2017
    13 // Update Count     : 51
     12// Last Modified On : Sat Jul  9 11:18:04 2016
     13// Update Count     : 40
    1414//
    1515
     
    3030// Calculate greatest common denominator of two numbers, the first of which may be negative. Used to reduce rationals.
    3131// alternative: https://en.wikipedia.org/wiki/Binary_GCD_algorithm
    32 static RationalImpl gcd( RationalImpl a, RationalImpl b ) {
     32static long int gcd( long int a, long int b ) {
    3333        for ( ;; ) {                                                                            // Euclid's algorithm
    34                 RationalImpl r = a % b;
     34                long int r = a % b;
    3535          if ( r == 0 ) break;
    3636                a = b;
     
    4040} // gcd
    4141
    42 static RationalImpl simplify( RationalImpl *n, RationalImpl *d ) {
     42static long int simplify( long int *n, long int *d ) {
    4343        if ( *d == 0 ) {
    4444                serr | "Invalid rational number construction: denominator cannot be equal to 0." | endl;
     
    5656} // rational
    5757
    58 void ?{}( Rational * r, RationalImpl n ) {
     58void ?{}( Rational * r, long int n ) {
    5959        r{ n, 1 };
    6060} // rational
    6161
    62 void ?{}( Rational * r, RationalImpl n, RationalImpl d ) {
    63         RationalImpl t = simplify( &n, &d );                            // simplify
     62void ?{}( Rational * r, long int n, long int d ) {
     63        long int t = simplify( &n, &d );                                        // simplify
    6464        r->numerator = n / t;
    6565        r->denominator = d / t;
     
    6767
    6868
    69 // getter for numerator/denominator
    70 
    71 RationalImpl numerator( Rational r ) {
     69// getter/setter for numerator/denominator
     70
     71long int numerator( Rational r ) {
    7272        return r.numerator;
    7373} // numerator
    7474
    75 RationalImpl denominator( Rational r ) {
    76         return r.denominator;
    77 } // denominator
    78 
    79 [ RationalImpl, RationalImpl ] ?=?( * [ RationalImpl, RationalImpl ] dest, Rational src ) {
    80         return *dest = src.[ numerator, denominator ];
    81 }
    82 
    83 // setter for numerator/denominator
    84 
    85 RationalImpl numerator( Rational r, RationalImpl n ) {
    86         RationalImpl prev = r.numerator;
    87         RationalImpl t = gcd( abs( n ), r.denominator );                // simplify
     75long int numerator( Rational r, long int n ) {
     76        long int prev = r.numerator;
     77        long int t = gcd( abs( n ), r.denominator );            // simplify
    8878        r.numerator = n / t;
    8979        r.denominator = r.denominator / t;
     
    9181} // numerator
    9282
    93 RationalImpl denominator( Rational r, RationalImpl d ) {
    94         RationalImpl prev = r.denominator;
    95         RationalImpl t = simplify( &r.numerator, &d );                  // simplify
     83long int denominator( Rational r ) {
     84        return r.denominator;
     85} // denominator
     86
     87long int denominator( Rational r, long int d ) {
     88        long int prev = r.denominator;
     89        long int t = simplify( &r.numerator, &d );                      // simplify
    9690        r.numerator = r.numerator / t;
    9791        r.denominator = d / t;
     
    176170
    177171// http://www.ics.uci.edu/~eppstein/numth/frap.c
    178 Rational narrow( double f, RationalImpl md ) {
     172Rational narrow( double f, long int md ) {
    179173        if ( md <= 1 ) {                                                                        // maximum fractional digits too small?
    180174                return (Rational){ f, 1};                                               // truncate fraction
     
    182176
    183177        // continued fraction coefficients
    184         RationalImpl m00 = 1, m11 = 1, m01 = 0, m10 = 0;
    185         RationalImpl ai, t;
     178        long int m00 = 1, m11 = 1, m01 = 0, m10 = 0;
     179        long int ai, t;
    186180
    187181        // find terms until denom gets too big
    188182        for ( ;; ) {
    189                 ai = (RationalImpl)f;
     183                ai = (long int)f;
    190184          if ( ! (m10 * ai + m11 <= md) ) break;
    191185                t = m00 * ai + m01;
     
    208202forall( dtype istype | istream( istype ) )
    209203istype * ?|?( istype *is, Rational *r ) {
    210         RationalImpl t;
     204        long int t;
    211205        is | &(r->numerator) | &(r->denominator);
    212206        t = simplify( &(r->numerator), &(r->denominator) );
Note: See TracChangeset for help on using the changeset viewer.