REAL PROC sine (REAL CONST arg): REAL CONST twopi :: 2.0 * pi; REAL VAR x :: arg; REAL VAR term :: x, sum :: 0.0, xsquared :: x * x; INT VAR n :: 1; reduce domain; REP REAL CONST old :: sum; take next term UNTIL sum = old ENDREP; sum. reduce domain: IF x > pi THEN REP x DECR twopi UNTIL x <= pi ENDREP ELIF x < - pi THEN REP x INCR twopi UNTIL x >= - pi ENDREP FI. take next term: sum INCR term; n INCR 1; term := - term * xsquared / real ((2 * n - 1) * (2 * n - 2)). ENDPROC sine; program: put (" built in programmed difference"); line (2); INT VAR i; FOR i FROM 1 UPTO 15 REP REAL CONST x :: pi * real (i) / 18.0; put (" "); put (sin (x)); put (" "); put (sine (x)); put (" "); put (sin (x) - sine (x)); line ENDREP. speedtest: REAL VAR x; INT VAR mx; put ("How many times? "); get (mx); line; INT CONST dummy :: exectime; UPTO mx REP x := sin (1.2); put ("+") ENDREP; put (exectime); line; UPTO mx REP x := sine (1.2); put ("-") ENDREP; put (exectime).