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.

 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