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


Obálka Obsah Index Hlavní stránka

změněno 4. srpna 2001
Copyright © 2000-2001 Vladimír Zábrodský, RNDr.