!!! ==================================================================== !!! Compute the Fibonacci series in Bliss-36 on TOPS-20, including the !!! ratios of successive terms, and their differences from the golden !!! ratio, with floating-point computating in single precision !!! (F-floating) format. !!! [26-Jun-2007] !!! ==================================================================== MODULE FIBMOD(MAIN = FIBONACCI) = BEGIN REQUIRE 'TUTIO'; ROUTINE TTY_PUT_FLT(value) : NOVALUE = BEGIN BUILTIN JSYS; LITERAL FLOUT = %O'233', PRIOU = %O'101'; REGISTER AC1 = 1, AC2 = 2, AC3 = 3; AC1 = PRIOU; AC2 = ..value; AC3 = %O'024034070700'; JSYS(2, FLOUT, AC1, AC2, AC3); ! print value END; ROUTINE FIBONACCI : NOVALUE = BEGIN BUILTIN CVTIF, DIVF, SUBF; LITERAL HT = %C' ', SPACE = %C' '; LOCAL den, diff, fk, fkm1, fkm2, k, num, ratio; OWN golden_ratio : INITIAL(%E'1.61803398874989484'); TTY_PUT_QUO('Fibonacci series in Bliss-36 [F-floating computation]:'); TTY_PUT_CRLF(); k = 1; fkm2 = 1; TTY_PUT_CHAR(HT); TTY_PUT_INTEGER(.k, 10, 5); TTY_PUT_CHAR(SPACE); TTY_PUT_INTEGER(.fkm2, 10, 15); TTY_PUT_CRLF(); k = 2; fkm1 = 1; TTY_PUT_CHAR(HT); TTY_PUT_INTEGER(.k, 10, 5); TTY_PUT_CHAR(SPACE); TTY_PUT_INTEGER(.fkm1, 10, 15); TTY_PUT_CRLF(); INCR k FROM 3 TO 100 DO BEGIN fk = .fkm1 + .fkm2; ! Fibonacci recursion IF (.fk LSS 0) THEN EXITLOOP; ! wrap to negative means integer overflow CVTIF(fk, num); CVTIF(fkm1, den); DIVF(den, num, ratio); ! ratio = fk/fkm1 SUBF(golden_ratio, ratio, diff); ! diff = ratio - golden_ratio fkm2 = .fkm1; fkm1 = .fk; TTY_PUT_CHAR(HT); TTY_PUT_INTEGER(.k, 10, 5); TTY_PUT_CHAR(SPACE); TTY_PUT_INTEGER(.fk, 10, 15); TTY_PUT_CHAR(SPACE); TTY_PUT_FLT(ratio); TTY_PUT_CHAR(SPACE); TTY_PUT_FLT(diff); TTY_PUT_CRLF(); END; END; END ELUDOM