\ elip Complete Elliptic Integral ACM Algorithm #149 \ Forth Scientific Library Algorithm #2 \ Evaluates the Complete Elliptic Integral, \ Elip[a, b] = int_0^{\pi/2} 1/Sqrt{a^2 cos^2(t) + b^2 sin^2(t)} dt \ This function can be used to evaluate the complete elliptic integral \ of the first kind, by using the relation K[m] = a Elip[a,b], m = 1 - b^2/a^2 \ This code conforms with ANS requiring: \ 1. The Floating-Point word set \ 2. The FCONSTANT PI (3.1415926536...) \ Both a recursive form and an iterative form are given, but because of the \ large stack consumption the recursive form is probably not of much \ practical use. \ Caution: this code can potentially go into an endless loop \ for certain values of the parameters. \ Collected Algorithms from ACM, Volume 1 Algorithms 1-220, \ 1980; Association for Computing Machinery Inc., New York, \ ISBN 0-89791-017-6 \ (c) Copyright 1994 Everett F. Carter. Permission is granted by the \ author to use this software for any application provided the \ copyright notice is preserved. \ ( ELIP V1.2 21 September 1994 EFC ) \ include lib/ansfloat.4th [UNDEFINED] felip [IF] [UNDEFINED] float [IF] [ABORT] [THEN] [UNDEFINED] pi [IF] include lib/fpconst.4th [THEN] : felip ( --, f: a b -- elip[a,b] ) \ nonrecursive version BEGIN FOVER FOVER F+ 2 S>F F/ FROT FROT F* FSQRT FOVER FOVER FOVER F- FABS FSWAP S" 1.0e-8" S>FLOAT F* F< UNTIL FDROP pi 2 S>F F/ FSWAP F/ ; \ test driver, calculates the complete elliptic integral of the first \ kind (K(m)) using the relation: K[m] = a Elip[a,b], m = 1 - b^2/a^2 \ compare with Abramowitz & Stegun, Handbook of Mathematical Functions, \ Table 17.1 false [IF] : felipr ( --, f: a b -- elip[a,b] ) \ recursive form FOVER FOVER FOVER F- FABS FSWAP S" 1.0e-8" S>FLOAT F* F< IF FDROP pi 2 S>F F/ FSWAP F/ ELSE FOVER FOVER F+ 2 S>F F/ FROT FROT F* FSQRT RECURSE THEN ; : elip_test ( -- ) fclear 10 set-precision CR ." m K(m) exact a Elip1[a,b] a Elip2[a,b] " CR ." 0.0 1.57079633 " S" 1000.0" S>FLOAT S" 1000.0" S>FLOAT felipr S" 1000.0" S>FLOAT F* F. ." " S" 1000.0" S>FLOAT S" 1000.0" S>FLOAT felip S" 1000.0" S>FLOAT F* F. CR ." 0.44 1.80632756 " S" 400.0" S>FLOAT S" 299.33259" S>FLOAT felipr S" 400.0" S>FLOAT F* F. ." " S" 400.0" S>FLOAT S" 299.33259" S>FLOAT felip S" 400.0" S>FLOAT F* F. CR ." 0.75 2.15651565 " S" 1000.0" S>FLOAT S" 500.0" S>FLOAT felipr S" 1000.0" S>FLOAT F* F. ." " S" 1000.0" S>FLOAT S" 500.0" S>FLOAT felip S" 1000.0" S>FLOAT F* F. CR ." 0.96 3.01611249 " S" 500.0" S>FLOAT S" 100.0" S>FLOAT felipr S" 500.0" S>FLOAT F* F. ." " S" 500.0" S>FLOAT S" 100.0" S>FLOAT felip S" 500.0" S>FLOAT F* F. CR ; elip_test [THEN] [THEN]