[Averages/Arithmetic mean - Rosetta Code] [EDSAC program (Initial Orders 2) to find and print the average of a sequence of 35-bit fractional values. Values are read from tape, preceded by an integer count.] [Library subroutine M3, runs at load time and is then overwritten. Prints header; here, last character sets teleprinter to figures.] PF GK IF AF RD LF UF OF E@ A6F G@ E8F EZ PF *!!!!!COUNT!!!!!!AVERAGE@&#.. [PZ] [Main routine: must be at even address] T214K GK [0] PF PF [average value] [2] PF PF [reciprocal of data count] [4] PF [data count] [5] PD [17-bit constant 1; also serves as '0' for printing] [6] @F [carriage return] [7] &F [line feed] [8] !F [space] [9] MF [dot (in figures mode)] [10] K4096F [teleprinter null] [Entry and outer loop] [11] A11@ G56F [call library subroutine R4, sets 0D := data count N] SD E64@ [exit if N = 0] T4F [clear acc] AF T4@ [load and save N (assumed < 2^16)] [18] A18@ G156F [print N (clears acc)] TD [clear whole of 0D, including sandwich bit] T4D [same for 4D] A4@ S2F [acc := N - 2] G66@ [jump to special action if N = 1] A2F [restore N after test] T5F [store N in 4D high word] A5@ T1F [store 1 in 0D high word] [29] A29@ G120F [call library subroutine D6, sets 0D := 0D/4D] AD T2#@ [load and save 1/N] T#@ [clear average] S4@ [load -N] [Inner loop] [35] T4@ [update negative loop counter] [36] A36@ G78F [read next datum to 0D (clears acc)] H2#@ [mult reg := 1/N] VD [acc := datum/N] A#@ T#@ [add into average] A4@ A5@ [increment negative loop counter] G35@ [loop until counter = 0] [45] O8@ O8@ [print 2 spaces] [Print the average value. NB: Library subroutine P1 requires non-negative input and prints only the digits after the decimal point. Formatting has to be done by the caller.] [47] A#@ [load average (order also serves as minus sign)] G52@ [jump if average < 0] TD [pass average to subroutine P1] O65@ [print plus sign (or could be space)] E56@ [join common code] [52] TD [average < 0; clear acc] S#@ TD [pass abs(average) to subroutine P1] O47@ [print minus sign] [56] O5@ O9@ [common code: print '0.'] [58] A58@ G192F [call P1 to print abs(average)] P8F [8 decimal places] O6@ O7@ [print CR, LF] E11@ [loop back always (because acc = 0)] [Jump to here if data count = 0, means end of data] [64] O10@ [print null to flush teleprinter buffer] [65] ZF [halt the machine (order also serves as plus sign)] [Jump to here if data count = 1] [66] TF [clear acc] [67] A67@ G78F [read datum to 0D] AD T#@ [average := datum] E45@ [jump to print the average] [The following puts the entry address into location 50, so that it can be accessed via the X parameter (see end of program). This is done in case the data is input from a separate tape.] T50K P11@ T11Z [Library subroutine R4. Input of one signed integer, returned in 0D.] T56K GKA3FT21@T4DH6@E11@P5DJFT6FVDL4FA4DTDI4FA4FS5@G7@S5@G20@SDTDT6FEF [Library subroutine R3. Input of one long signed decimal fraction, returned in 0D.] T78K GKT45KP26@TZA3FTHTDT4DA6HT9@H1HS4HT6FIFAFS4HE7HT7FV4DL8FADT4DA6FA5HG8@ H2#HN4DLDYFTDT28#ZPFT27ZTFP610D@524DP5DPDIFS4HG37@S4DT4DT7FA1HT9@E18@ [Library subroutine D6 - Division, accurate, fast. 36 locations, workspace 6D and 8D. 0D := 0D/4D, where 4D <> 0, -1.] T120K GKA3FT34@S4DE13@T4DSDTDE2@T4DADLDTDA4DLDE8@RDU4DLDA35@ T6DE25@U8DN8DA6DT6DH6DS6DN4DA4DYFG21@SDVDTDEFW1526D [Library subroutine P7: print strictly positive integer in 0D.] T156K GKA3FT26@H28#@NDYFLDT4DS27@TFH8@S8@T1FV4DAFG31@SFLDUFOFFFSF L4FT4DA1FA27@G11@T28#ZPFT27ZP1024FP610D@524D!FO30@SFL8FE22@ [Library subroutine P1: print non-negative fraction in 0D, without '0.'] T192K GKA18@U17@S20@T5@H19@PFT5@VDUFOFFFSFL4FTDA5@A2FG6@EFU3FJFM1F [========================================================================== On the original EDSAC, the following (without the whitespace and comments) might have been input on a separate tape.] E25K TX GK EZ [define entry point] PF [acc = 0 on entry] [Counts and data values to be read by library subroutines R3 and R4 respectively. Note (1) Sign comes *after* value (2) In the data, leading '0.' is omitted.] 7+ 1-2-3-4-5+2-3- 1+ 987654321+ 9+ 01+04+09+16+25+36+49+64+81+ 9+ 01-04+09-16+25-36+49-64+81- [Daily minimum temperature (unit = 10 deg. C), Cambridge, UK, January 2000] 31+ 34+14+49+00+04+48+05+48+23-35-07-75+19+03+ 26+27+17-06-52+22-17+18+15+03-33-11-04-01-44+89+95+ 0+