[Richard Suchenwirth] 2002-12-01 - Here are some little pieces that don't deserve a page of their own yet. ---- **A sum to get e** Reading "What is J?" (the ASCIIfied successor to APL, see [Playing APL]), one nice example was how to approximate the Euler number e: +/ % ! i. 9 which in more conventional math notation is _8_ \ 1 > --- /__ i! i=0 Too lazy to start and reimplement J in Tcl, I decided to express this in Tcl as natural as possible: ====== proc Sum {itName from to body} { upvar 1 $itName it set res 0 for {set it $from} {$it<=$to} {incr it} { set res [uplevel 1 expr $res+$body] } set res } proc fact n {expr {$n<2? 1: wide($n)*[fact [incr n -1]]}} ====== It worked alright (the wide() cast was necessary to enter the 64 bit realm), but in the 18th iteration got saturated into a slightly wrong result, while [expr] itself knows better: ====== % Sum i 0 17 {1./[fact $i]} 2.7182818284590455 % expr exp(1) 2.7182818284590451 ====== ---- **Continued fraction** Also in the J paper, it is shown how to approximate the ''golden ratio'' `x-1 = 1/x` with the continued fraction (+ %) / 15 $ 1 which in more conventional spelling is 1 1 + ------------------ 1 1 + -------------- 1 1 + ---------- 1 + ... ad infinitum (or for a number of iterations at least, 15 in the example). To wrap this nicely in Tcl, I invented an extra notation where @ stands for "the whole thing again". Execution has to start from bottom right of course, with a default value of 1, and work its way up for the specified number of iterations: ====== proc continuedFraction {body iterations} { regsub -all @ $body {$res} body set res 1 for {set i 0} {$i<$iterations} {incr i} { set res [expr $body] } set res } ====== % continuedFraction {1 + 1./@} 15 1.6180344478216819 With increasing number of iterations, the results oscillate ever closer around one value, until from 38 up they don't change any more: % continuedFraction {1 + 1./@} 38 1.6180339887498949 <>Mathematics