Changeset 0087e0e


Ignore:
Timestamp:
Mar 27, 2019, 8:58:53 AM (5 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
1e5d0f0c
Parents:
8a30423
git-author:
Peter A. Buhr <pabuhr@…> (03/27/19 08:56:46)
git-committer:
Peter A. Buhr <pabuhr@…> (03/27/19 08:58:53)
Message:

add rational exponentiation, code clean up

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/rational.cfa

    r8a30423 r0087e0e  
    1010// Created On       : Wed Apr  6 17:54:28 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Dec 23 22:56:49 2018
    13 // Update Count     : 170
     12// Last Modified On : Wed Mar 27 08:45:59 2019
     13// Update Count     : 180
    1414//
    1515
     
    5454        void ?{}( Rational(RationalImpl) & r, RationalImpl n, RationalImpl d ) {
    5555                RationalImpl t = simplify( n, d );                              // simplify
    56                 r.numerator = n / t;
    57                 r.denominator = d / t;
     56                r.[numerator, denominator] = [n / t, d / t];
    5857        } // rational
    5958
     
    7877                RationalImpl prev = r.numerator;
    7978                RationalImpl t = gcd( abs( n ), r.denominator ); // simplify
    80                 r.numerator = n / t;
    81                 r.denominator = r.denominator / t;
     79                r.[numerator, denominator] = [n / t, r.denominator / t];
    8280                return prev;
    8381        } // numerator
     
    8684                RationalImpl prev = r.denominator;
    8785                RationalImpl t = simplify( r.numerator, d );    // simplify
    88                 r.numerator = r.numerator / t;
    89                 r.denominator = d / t;
     86                r.[numerator, denominator] = [r.numerator / t, d / t];
    9087                return prev;
    9188        } // denominator
     
    120117
    121118        Rational(RationalImpl) +?( Rational(RationalImpl) r ) {
    122                 Rational(RationalImpl) t = { r.numerator, r.denominator };
    123                 return t;
     119                return (Rational(RationalImpl)){ r.numerator, r.denominator };
    124120        } // +?
    125121
    126122        Rational(RationalImpl) -?( Rational(RationalImpl) r ) {
    127                 Rational(RationalImpl) t = { -r.numerator, r.denominator };
    128                 return t;
     123                return (Rational(RationalImpl)){ -r.numerator, r.denominator };
    129124        } // -?
    130125
    131126        Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    132127                if ( l.denominator == r.denominator ) {                 // special case
    133                         Rational(RationalImpl) t = { l.numerator + r.numerator, l.denominator };
    134                         return t;
     128                        return (Rational(RationalImpl)){ l.numerator + r.numerator, l.denominator };
    135129                } else {
    136                         Rational(RationalImpl) t = { l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator };
    137                         return t;
     130                        return (Rational(RationalImpl)){ l.numerator * r.denominator + l.denominator * r.numerator, l.denominator * r.denominator };
    138131                } // if
    139132        } // ?+?
     
    141134        Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    142135                if ( l.denominator == r.denominator ) {                 // special case
    143                         Rational(RationalImpl) t = { l.numerator - r.numerator, l.denominator };
    144                         return t;
     136                        return (Rational(RationalImpl)){ l.numerator - r.numerator, l.denominator };
    145137                } else {
    146                         Rational(RationalImpl) t = { l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator };
    147                         return t;
     138                        return (Rational(RationalImpl)){ l.numerator * r.denominator - l.denominator * r.numerator, l.denominator * r.denominator };
    148139                } // if
    149140        } // ?-?
    150141
    151142        Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    152                 Rational(RationalImpl) t = { l.numerator * r.numerator, l.denominator * r.denominator };
    153                 return t;
     143                return (Rational(RationalImpl)){ l.numerator * r.numerator, l.denominator * r.denominator };
    154144        } // ?*?
    155145
    156146        Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    157147                if ( r.numerator < (RationalImpl){0} ) {
    158                         r.numerator = -r.numerator;
    159                         r.denominator = -r.denominator;
     148                        r.[numerator, denominator] = [-r.numerator, -r.denominator];
    160149                } // if
    161                 Rational(RationalImpl) t = { l.numerator * r.denominator, l.denominator * r.numerator };
    162                 return t;
     150                return (Rational(RationalImpl)){ l.numerator * r.denominator, l.denominator * r.numerator };
    163151        } // ?/?
    164152
     
    167155        forall( dtype istype | istream( istype ) | { istype & ?|?( istype &, RationalImpl & ); } )
    168156        istype & ?|?( istype & is, Rational(RationalImpl) & r ) {
    169                 RationalImpl t;
    170157                is | r.numerator | r.denominator;
    171                 t = simplify( r.numerator, r.denominator );
     158                RationalImpl t = simplify( r.numerator, r.denominator );
    172159                r.numerator /= t;
    173160                r.denominator /= t;
     
    185172        } // distribution
    186173} // distribution
     174
     175forall( otype RationalImpl | arithmetic( RationalImpl ) | { RationalImpl ?\?( RationalImpl, unsigned long ); } )
     176Rational(RationalImpl) ?\?( Rational(RationalImpl) x, long int y ) {
     177        if ( y < 0 ) {
     178                return (Rational(RationalImpl)){ x.denominator \ -y, x.numerator \ -y };
     179        } else {
     180                return (Rational(RationalImpl)){ x.numerator \ y, x.denominator \ y };
     181        } // if
     182}
    187183
    188184// conversion
  • libcfa/src/rational.hfa

    r8a30423 r0087e0e  
    1212// Created On       : Wed Apr  6 17:56:25 2016
    1313// Last Modified By : Peter A. Buhr
    14 // Last Modified On : Tue Dec  4 23:07:46 2018
    15 // Update Count     : 106
     14// Last Modified On : Tue Mar 26 23:16:10 2019
     15// Update Count     : 109
    1616//
    1717
     
    9898} // distribution
    9999
     100forall( otype RationalImpl | arithmetic( RationalImpl ) |{RationalImpl ?\?( RationalImpl, unsigned long );} )
     101Rational(RationalImpl) ?\?( Rational(RationalImpl) x, long int y );
     102
    100103// conversion
    101104forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
  • tests/rational.cfa

    r8a30423 r0087e0e  
    1010// Created On       : Mon Mar 28 08:43:12 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Mar 19 08:30:28 2019
    13 // Update Count     : 73
     12// Last Modified On : Wed Mar 27 07:37:17 2019
     13// Update Count     : 80
    1414//
    1515
     
    5454        sout | a * b;
    5555        sout | a / b;
     56//      sout | a \ 2 | b \ 2; // FIX ME
     57//      sout | a \ -2 | b \ -2;
    5658
    5759        sout | "conversion";
Note: See TracChangeset for help on using the changeset viewer.