This is an old revision of the document!
Finding the SUM or MOD of a partial array
by Richard Russell, January 2023
The SUM() and MOD() functions return the sum and modulus (square-root of the sum of the squares) respectively of a numeric array, and they are much faster than performing the calculations yourself in a loop. However you have no control over which elements are operated on: it is always the entire array (remember that in BBC BASIC array indices are zero-based).
To find the sum or modulus of a subset of the elements you can use the user-defined functions below. To illustrate their use, this code calculates the Standard Deviation of elements 1 to 8 inclusive of an array:
DIM array(9) array() = 1,2,3,4,5,6,7,8,9,10 mean = FNsum(array(),1,8) / 8 array() -= mean PRINT FNmod(array(),1,8) / SQR(8)
This prints 2.29128785, being the Standard Deviation of the values 2,3,4,5,6,7,8 and 9.
Here are the functions:
DEF FNsum(a(), I%, N%) IF DIM(a())<>1 ERROR 0, "Array must be one-dimensional" IF I% < 0 OR N% < 1 OR I% + N% - 1 > DIM(a(),1) ERROR 0, "Invalid array limits" LOCAL p%% : p%% = ^a(I%) - 5 : PTR(a()) = p%% LOCAL ?p%%, p%%!1 : ?p%% = 1 : p%%!1 = N% = SUM(a()) DEF FNmod(a(), I%, N%) IF DIM(a())<>1 ERROR 0, "Array must be one-dimensional" IF I% < 0 OR N% < 1 OR I% + N% - 1 > DIM(a(),1) ERROR 0, "Invalid array limits" LOCAL p%% : p%% = ^a(I%) - 5 : PTR(a()) = p%% LOCAL ?p%%, p%%!1 : ?p%% = 1 : p%%!1 = N% = MOD(a())