RosettaCodeData/Task/Continued-fraction/Icon/continued-fraction.icon
2023-07-01 13:44:08 -04:00

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