Rational arithmetic 
 
IMPLEMENTATION 
A rational number is a string containing pair of integers  U UI separated by blanks.  U is numerator and  UI is denominator of the rational number  (U/UI).  U and  UI are relatively prime to each other and  UI>0. The number zero is represented as  0 1.
   
 
ADDITION & SUBTRACTION FRACTIONS 
 
 
 FADD: procedure
 parse arg U UI, V VI
 D1 = GCD(UI, VI)
 if D1 = 1 then return,
   LAST(U * VI + UI * V, UI * VI)
 T = U * (VI / D1) + V * (UI / D1)
 D2 = GCD(T, D1)
 return LAST(T / D2, (UI / D1) * (VI / D2))
 
  |   
  Where the  LAST and  GCD functions are (see as well as  Euclid's GCD (and LCM) algorithm):
 LAST & GCD 
 
 LAST: procedure
 parse arg W1, W2
 if W2 < 0
   then do
     W2 = ABS(W2); W1 = -W1
   end
 D3 = GCD(W1, W2)
 return (W1 / D3) (W2 / D3)
  
 GCD: procedure 
 parse arg A, B 
 A = ABS(A)
 do while B > 0 
   parse value(B A//B) with A B 
 end 
 return A
 
  |   
  
MULTIPLICATION FRACTIONS 
 
 
 FMUL: procedure
 parse arg U UI, V VI
 UV = U * V; UIVI = UI * VI
 D = GCD(UV, UIVI)
 return LAST(UV / D, UIVI / D)
 
  |   
  
DIVISION FRACTIONS 
 
 
 FDIV: procedure
 parse arg U UI, V VI
 if V = 0 then 
   call ERROR "FDIV - error divide by zero"
 D1 = GCD(U, V); D2 = GCD(UI, VI)
 return LAST((U / D1) * (VI / D2) *,
   SIGN(V), ABS((UI / D2) * (V / D1)))
  
 ERROR: say ARG(1); exit
 
  |   
  
COMPARISON FRACTIONS 
The  FCOMP function returns  -1 for  (U/UI)<(V/VI),  0 for  (U/UI)=(V/VI), and  1 for  (U/UI)>(V/VI). 
  
 
 FCOMP: procedure
 parse arg U UI, V VI
 return SIGN(U * VI - V * UI)
 
  |   
  
EXAMPLE The program 
 
 say "(2/3) + (1/5) =" FWRITE(FADD(2 3, 1 5))
 say "(3/4) - (2/5) =" FWRITE(FADD(3 4, -2 5))
 say "(15/14) * (21/25) =",
     FWRITE(FMUL(15 14, 21 25))
 say "(7/2) : (11/4) =" FWRITE(FDIV(7 2, 11 4))
 exit 
 ...
 FWRITE: procedure
 parse arg N D 
 return "(" || N || "/" || D || ")" 
 
  |   
displays on the screen:  
 
 (2/3) + (1/5) = (13/15)
 (3/4) - (2/5) = (7/20)
 (15/14) * (21/25) = (9/10)
 (7/2) : (11/4) = (14/11)
  
  |   
  
CONNECTIONS 
 Literature Knuth D. E., Seminumerical Algorithms, vol. 2 of The Art of Computer Programming  Addison-Wesley, 1973 
  
   |