50 lines
1.2 KiB
Text
50 lines
1.2 KiB
Text
$define EVAL_DEPTH 100
|
|
|
|
# A generalized continued fraction, represented by two functions. Each
|
|
# function maps from an index to a floating-point value.
|
|
record continued_fraction (a, b)
|
|
|
|
procedure main ()
|
|
writes (" sqrt 2.0 = ")
|
|
write (evaluate_continued_fraction (continued_fraction (sqrt2_a, sqrt2_b),
|
|
EVAL_DEPTH))
|
|
writes (" e = ")
|
|
write (evaluate_continued_fraction (continued_fraction (e_a, e_b),
|
|
EVAL_DEPTH))
|
|
writes (" pi = ")
|
|
write (evaluate_continued_fraction (continued_fraction (pi_a, pi_b),
|
|
EVAL_DEPTH))
|
|
end
|
|
|
|
procedure evaluate_continued_fraction (frac, depth)
|
|
local i, retval
|
|
retval := frac.a (depth)
|
|
every i := depth to 1 by -1 do {
|
|
retval := frac.a (i - 1) + (frac.b (i) / retval)
|
|
}
|
|
return retval
|
|
end
|
|
|
|
procedure sqrt2_a (i)
|
|
return (if i = 0 then 1.0 else 2.0)
|
|
end
|
|
|
|
procedure sqrt2_b (i)
|
|
return 1.0
|
|
end
|
|
|
|
procedure e_a (i)
|
|
return (if i = 0 then 2.0 else real (i))
|
|
end
|
|
|
|
procedure e_b (i)
|
|
return (if i = 1 then 1.0 else real (i - 1))
|
|
end
|
|
|
|
procedure pi_a (i)
|
|
return (if i = 0 then 3.0 else 6.0)
|
|
end
|
|
|
|
procedure pi_b (i)
|
|
return real (((2 * i) - 1)^2)
|
|
end
|