OBSAH TROJÚHELNÍKA
PROBLÉM
Jsou dány tři strany trojúhelníka X, Y, Z, máme vypočítat jeho obsah.
Numericky nestabilní a numericky stabilní řešení
Klasický vzorec pochází od Herona z Alexandrie. Využívá jej následující funkce HERON
IMPLEMENTACE
Jednotka: vnitřní funkce
Vazba:
funkce SQRT
Parametry: kladná reálná čísla X, Y, Z - délky stran trojúhelníka, přirozené P - počet platných číslic v hodnotě výsledku, implicitně 9
Vrací:
obsah trojúhelníka
HERON: procedure
parse arg X, Y, Z, P
if P = "" then P = 9; numeric digits P
S = (X + Y + Z) / 2
return SQRT(S * (S - X) * (S - Y) * (S - Z), P)
|
Tato funkce je numericky nestabilní pro trojúhelníky s jedním velmi malým úhlem, vypadají jako jehly. W. Kahan popisuje následující numericky stabilní funkci
ATRIAN: procedure
parse arg X, Y, Z, P
if P = "" then P = 9; numeric digits P
/* uspořádat X, Y, Z, tak že X>=Y>=Z */
if Y > X
then do; W = X; X = Y; Y = W; end
if Z > X
then do; W = X; X = Z; Z = W; end
if Z > Y
then do; W = Y; Y = Z; Z = W; end
if Z < (X - Y)
then call ERROR "Takový trojúhelník neexistuje"
else do
W1 = X + Y + Z
W2 = -X + Y + Z
W3 = X - Y + Z
W4 = X + Y - Z
return SQRT(W1 * W2 * W3 * W4, P) / 4
end
ERROR: say ARG(1); exit
|
Příklad (W. Kahan) Program
X = 100.01; Y = 99.995; Z = 0.025
say " 5 platných. č. Heron" HERON(X, Y, Z, 5)
say "20 platných. č. Heron" HERON(X, Y, Z, 20)
say " 5 platných. č. Kahan" ATRIAN(X, Y, Z, 5)
say "20 platných. č. Kahan" ATRIAN(X, Y, Z, 20)
exit
...
|
zobrazí na displeji:
5 platných. č. Heron 1.5813
20 platných. č. Heron 1.0000249921876952771
5 platných. č. Kahan 1.0000
20 platných. č. Kahan 1.0000249921876952771
|
Literatura
Kahan W., Mathematics Written in Sand
SPOLUAUTOR
|