ARITMETIKA RACIONÁLNÍCH ČÍSEL
IMPLEMENTACE
Racionální číslo je implementováno řetězcem, který obsahuje dvojici celých čísel oddělených mezerou. V zápise U UI je U čitatel a UI jmenovatel racionálního čísla (U/UI).
Předpokládáme, že U a UI jsou nesoudělná čísla (zlomek je tedy zapsán v tzv. základním tvaru) a UI>0. Číslo nula je reprezentováno dvojicí 0 1.
SEČÍTÁNÍ & ODČÍTÁNÍ ZLOMKŮ
FADD: procedure
parse arg U UI, V VI
D1 = NSD(UI, VI)
if D1 = 1 then return,
LAST(U * VI + UI * V, UI * VI)
T = U * (VI / D1) + V * (UI / D1)
D2 = NSD(T, D1)
return LAST(T / D2, (UI / D1) * (VI / D2))
|
zde použité funkce LAST a NSD jsou (viz také Euklidův algoritmus pro výpočet NSD...):
LAST & NSD
LAST: procedure
parse arg W1, W2
if W2 < 0
then do
W2 = ABS(W2); W1 = -W1
end
D3 = NSD(W1, W2)
return (W1 / D3) (W2 / D3)
NSD: procedure
parse arg A, B
A = ABS(A)
do while B > 0
parse value(B A//B) with A B
end
return A
|
NÁSOBENÍ ZLOMKŮ
FMUL: procedure
parse arg U UI, V VI
UV = U * V; UIVI = UI * VI
D = NSD(UV, UIVI)
return LAST(UV / D, UIVI / D)
|
DĚLENÍ ZLOMKŮ
FDIV: procedure
parse arg U UI, V VI
if V = 0 then
call ERROR "FDIV - chyba dělení nulou"
D1 = NSD(U, V); D2 = NSD(UI, VI)
return LAST((U / D1) * (VI / D2) *,
SIGN(V), ABS((UI / D2) * (V / D1)))
ERROR: say ARG(1); exit
|
POROVNÁNÍ ZLOMKŮ
Funkce FCOMP vrací -1 pro (U/UI)<(V/VI), 0 pro (U/UI)=(V/VI), a 1 pro (U/UI)>(V/VI).
FCOMP: procedure
parse arg U UI, V VI
return SIGN(U * VI - V * UI)
|
PŘÍKLAD 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 || ")"
|
zobrazí:
(2/3) + (1/5) = (13/15)
(3/4) - (2/5) = (7/20)
(15/14) * (21/25) = (9/10)
(7/2) : (11/4) = (14/11)
|
SOUVISLOSTI
Literatura Knuth D. E., Seminumerical Algorithms, vol. 2 of The Art of Computer Programming Addison-Wesley, 1973
|