THE AREA OF A TRIANGLE

PROBLEM
Given the lengths of three sides of a triangle X, Y, Z. How to calculate the area of this triangle?

Numerically unstable and numerically stable solution
The classical formula due to Heron of Alexandria first calculates a semiperimeter, S, as half the sum of the sides, and then evaluates the area as in the following internal function HERON

IMPLEMENTATION
Unit: internal function

Interface: the functions SQRT

Parameters: positive real numbers X, Y, Z - lengths of three sides of a triangle
a positive integer P - number of significant digits of result, default is 9

Returns: the area of a triangle

 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)

This function is numerically unstable for needle-shape triangle. W. Kahan describes a good, numerically stable, function. It follows:

 ATRIAN: procedure parse arg X, Y, Z, P if P = "" then P = 9; numeric digits P 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 "No such triangle exist"   else do     W1 = Y + Z + X; W2 = Y - X + Z     W3 = X - Y + Z; W4 = Y - Z + X     return SQRT(W1 * W2 * W3 * W4, P) / 4   end   ERROR: say ARG(1); exit

Example (W. Kahan)
The following program

 X = 100.01; Y = 99.995; Z = 0.025 say " 5 sig. dig. Heron" HERON(X, Y, Z, 5) say "20 sig. dig. Heron" HERON(X, Y, Z, 20) say " 5 sig. dig. Kahan" ATRIAN(X, Y, Z, 5) say "20 sig. dig. Kahan" ATRIAN(X, Y, Z, 20) exit ...

displays on the screen:

 5 sig. dig. Heron 1.5813 20 sig. dig. Heron 1.0000249921876952771  5 sig. dig. Kahan 1.0000 20 sig. dig. Kahan 1.0000249921876952771

Literature
Kahan W., Mathematics Written in Sand