Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/rational.cfa

    r8a25be9 ref346f7c  
    1010// Created On       : Wed Apr  6 17:54:28 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 28 17:33:03 2019
    13 // Update Count     : 181
     12// Last Modified On : Sun Dec 23 22:56:49 2018
     13// Update Count     : 170
    1414//
    1515
     
    3535        static RationalImpl simplify( RationalImpl & n, RationalImpl & d ) {
    3636                if ( d == (RationalImpl){0} ) {
    37                         abort( "Invalid rational number construction: denominator cannot be equal to 0.\n" );
     37                        serr | "Invalid rational number construction: denominator cannot be equal to 0.";
     38                        exit( EXIT_FAILURE );
    3839                } // exit
    3940                if ( d < (RationalImpl){0} ) { d = -d; n = -n; } // move sign to numerator
     
    5354        void ?{}( Rational(RationalImpl) & r, RationalImpl n, RationalImpl d ) {
    5455                RationalImpl t = simplify( n, d );                              // simplify
    55                 r.[numerator, denominator] = [n / t, d / t];
     56                r.numerator = n / t;
     57                r.denominator = d / t;
    5658        } // rational
    5759
     
    7678                RationalImpl prev = r.numerator;
    7779                RationalImpl t = gcd( abs( n ), r.denominator ); // simplify
    78                 r.[numerator, denominator] = [n / t, r.denominator / t];
     80                r.numerator = n / t;
     81                r.denominator = r.denominator / t;
    7982                return prev;
    8083        } // numerator
     
    8386                RationalImpl prev = r.denominator;
    8487                RationalImpl t = simplify( r.numerator, d );    // simplify
    85                 r.[numerator, denominator] = [r.numerator / t, d / t];
     88                r.numerator = r.numerator / t;
     89                r.denominator = d / t;
    8690                return prev;
    8791        } // denominator
     
    116120
    117121        Rational(RationalImpl) +?( Rational(RationalImpl) r ) {
    118                 return (Rational(RationalImpl)){ r.numerator, r.denominator };
     122                Rational(RationalImpl) t = { r.numerator, r.denominator };
     123                return t;
    119124        } // +?
    120125
    121126        Rational(RationalImpl) -?( Rational(RationalImpl) r ) {
    122                 return (Rational(RationalImpl)){ -r.numerator, r.denominator };
     127                Rational(RationalImpl) t = { -r.numerator, r.denominator };
     128                return t;
    123129        } // -?
    124130
    125131        Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    126132                if ( l.denominator == r.denominator ) {                 // special case
    127                         return (Rational(RationalImpl)){ l.numerator + r.numerator, l.denominator };
     133                        Rational(RationalImpl) t = { l.numerator + r.numerator, l.denominator };
     134                        return t;
    128135                } else {
    129                         return (Rational(RationalImpl)){ l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator };
     136                        Rational(RationalImpl) t = { l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator };
     137                        return t;
    130138                } // if
    131139        } // ?+?
     
    133141        Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    134142                if ( l.denominator == r.denominator ) {                 // special case
    135                         return (Rational(RationalImpl)){ l.numerator - r.numerator, l.denominator };
     143                        Rational(RationalImpl) t = { l.numerator - r.numerator, l.denominator };
     144                        return t;
    136145                } else {
    137                         return (Rational(RationalImpl)){ l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator };
     146                        Rational(RationalImpl) t = { l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator };
     147                        return t;
    138148                } // if
    139149        } // ?-?
    140150
    141151        Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    142                 return (Rational(RationalImpl)){ l.numerator * r.numerator, l.denominator * r.denominator };
     152                Rational(RationalImpl) t = { l.numerator * r.numerator, l.denominator * r.denominator };
     153                return t;
    143154        } // ?*?
    144155
    145156        Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    146157                if ( r.numerator < (RationalImpl){0} ) {
    147                         r.[numerator, denominator] = [-r.numerator, -r.denominator];
     158                        r.numerator = -r.numerator;
     159                        r.denominator = -r.denominator;
    148160                } // if
    149                 return (Rational(RationalImpl)){ l.numerator * r.denominator, l.denominator * r.numerator };
     161                Rational(RationalImpl) t = { l.numerator * r.denominator, l.denominator * r.numerator };
     162                return t;
    150163        } // ?/?
    151164
     
    154167        forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } )
    155168        istype & ?|?( istype & is, Rational(RationalImpl) & r ) {
     169                RationalImpl t;
    156170                is | r.numerator | r.denominator;
    157                 RationalImpl t = simplify( r.numerator, r.denominator );
     171                t = simplify( r.numerator, r.denominator );
    158172                r.numerator /= t;
    159173                r.denominator /= t;
     
    171185        } // distribution
    172186} // distribution
    173 
    174 forall( otype RationalImpl | arithmetic( RationalImpl ) | { RationalImpl ?\?( RationalImpl, unsigned long ); } )
    175 Rational(RationalImpl) ?\?( Rational(RationalImpl) x, long int y ) {
    176         if ( y < 0 ) {
    177                 return (Rational(RationalImpl)){ x.denominator \ -y, x.numerator \ -y };
    178         } else {
    179                 return (Rational(RationalImpl)){ x.numerator \ y, x.denominator \ y };
    180         } // if
    181 }
    182187
    183188// conversion
Note: See TracChangeset for help on using the changeset viewer.